Простая функция для использования и понимания некоторых асинхронных замен:
async function replaceAsync(str, regex, asyncFn) {
const promises = [];
str.replace(regex, (match, ...args) => {
const promise = asyncFn(match, ...args);
promises.push(promise);
});
const data = await Promise.all(promises);
return str.replace(regex, () => data.shift());
}
Он выполняет функцию замены дважды, поэтому будьте осторожны, если вы делаете что-то тяжелое для обработки. Однако для большинства случаев это очень удобно.
Используйте это так:
replaceAsync(myString, /someregex/g, myAsyncFn)
.then(replacedString => console.log(replacedString))
Или это:
const replacedString = await replaceAsync(myString, /someregex/g, myAsyncFn);
Не забывайте, что ваш myAsyncFn
должен вернуть обещание.
Пример asyncFunction:
async function myAsyncFn(match) {
// match is an url for example.
const fetchedJson = await fetch(match).then(r => r.json());
return fetchedJson['date'];
}
function myAsyncFn(match) {
// match is a file
return new Promise((resolve, reject) => {
fs.readFile(match, (err, data) => {
if (err) return reject(err);
resolve(data.toString())
});
});
}
person
Overcl9ck
schedule
30.12.2017
async
всегда является объектом Promise, который разрешается с возвращеннымoutput
(или отклоняется с выданной ошибкой). - person Madara's Ghost   schedule 10.11.2015output
- это обещание? Мне неясно, в чем ваша проблема. Обратите внимание: еслиstring.replace
буквальноString.prototype.replace
, это не сработает..replace
ожидает, что обратный вызов будет нормальной функцией, а не асинхронной функцией. - person Felix Kling   schedule 10.11.2015