一个易于使用和理解的异步替换功能:
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())
});
});
}