我有一系列的几个 map,其中一个需要针对每个数组元素执行数据库操作,因此我正在使用 async await。
const resultsAsPromises = arr
.map(syncDouble)
.map(asyncMapper)
如果它是链中的最后一项,那么这不是一个问题,因为我可以使用Promise.all
解开它。
console.log('results', await Promise.all(resultsAsPromises))
然而,我需要执行其他同步操作,因此我希望在继续下一个.map
之前解开承诺的值。
有没有办法做到这一点?我想也许只需创建一个提取映射器,例如:
function extractPromiseValues(value) {
return value.then(v => v);
}
会起作用,但是很遗憾,不行。
var arr = [1, 2, 3, 4, 5];
function timeout(i) {
return new Promise((resolve) => {
setTimeout(() => {
return resolve(`number is ${i}`);
}, 1);
});
}
function syncDouble(i) {
return i * 2;
}
async function asyncMapper(i) {
return await timeout(i)
}
function extractPromiseValues(value) {
return value.then(v => v);
}
async function main() {
const resultsAsPromises = arr
.map(syncDouble)
.map(asyncMapper)
// .map(extractPromiseValues)
console.log('results', await Promise.all(resultsAsPromises))
}
main();
.map()
调用链,在某个点上,其中一个返回一个承诺数组,下一个返回从这些承诺解析的值数组。在这种情况下,我不确定下面的答案是否解决了这个问题。你有什么想法吗? - Ghassen Louhaichiarr.map(returnValAfter1sec).map(doubleValAfterThat)
可以按照写法实现吗?(其中returnValAfter1sec
接受一个值并返回一个 Promise,而doubleValAfterThat
接受一个 Promise 并返回一个值)。 - Ghassen Louhaichi.reduce()
方法的返回值仍然是一个 Promise。无论你采用何种方法,都必须在链的那一部分前面插入await
。 - Patrick Roberts(await <asyncPart>)<syncPart>
包装链的异步部分。 - Ghassen Louhaichi