一个易于使用和理解的函数,用于一些异步替换:
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
需要返回一个Promise。
异步函数的示例:
async function myAsyncFn(match) {
const fetchedJson = await fetch(match).then(r => r.json());
return fetchedJson['date'];
}
function myAsyncFn(match) {
return new Promise((resolve, reject) => {
fs.readFile(match, (err, data) => {
if (err) return reject(err);
resolve(data.toString())
});
});
}
async
函数的返回值始终是一个 Promise 对象,该对象通过返回的output
值解决(resolve),或者通过抛出的错误拒绝(reject)。 - Madara's Ghostoutput
是一个promise?我不清楚你遇到了什么问题。请注意,如果string.replace
就是String.prototype.replace
,那么它将无法正常工作。.replace
期望回调是一个普通函数,而不是一个异步函数。 - Felix Kling