在迭代中解决承诺



我希望迭代一些承诺,但 lambda 函数在解决它们之前就已经完成。

module.exports.handler= async(event, context, callback) => {
let a = {'a': 'b', 'x', 'y'};
let b = {'i': 'n'};
Object.keys(listA).map(async ax => {
Object.keys(listB).map(async bx => {
await validate(ax, bx);
}
}
}
async function validate(a, b) {
let promise = getPromise(a, b);
await promise.then((output) => {
...
console.log('success');
});
}

如何在流程完成之前解决所有承诺?

这是因为需要回调的循环中的 wait 不会同步处理(请参阅此处(。

避免这种情况的一种方法是,您可以构建一系列承诺,并使用 Promise.all 等待完成。

例:

module.exports.handler = (event, context, callback) => {
let a = {'a': 'b', 'x': 'foo', 'y': 'bar'};
let b = {'i': 'n'};
let promises = []
Object.keys(a).forEach(ax => {
Object.keys(b).forEach(bx => {
promises.push(validate(ax, bx));
})
})
Promise.all(promises)
.then(results => {
//do stuff with results
})
.catch(error => {
//handle error
})
}

Promise.allSettled(( 方法返回一个承诺,该承诺在所有给定的承诺都已解析或拒绝后解析,其中包含一个对象数组,每个对象描述每个承诺的结果。

您可以使用@Michael解决方案,只需将 Promise.all 替换为 承诺.全部结算

Promise.allSettled(( 方法返回一个承诺,该承诺在之后解析 所有给定的承诺要么已经解决,要么被拒绝,并带有 每个对象数组描述每个承诺的结果 Mozilla 文档。

Promise.all(( 方法返回一个 Promise,该 Promise 在以下情况下实现 作为可迭代对象传递的所有承诺都已实现,或者何时 可迭代对象不包含任何承诺。它以 第一个拒绝Mozilla Doc的承诺。

module.exports.handler = (event, context, callback) => {
let a = {'a': 'b', 'x': 'foo', 'y': 'bar'};
let b = {'i': 'n'};
let promises = []
Object.keys(a).forEach(ax => {
Object.keys(b).forEach(bx => {
promises.push(validate(ax, bx));
})
})
Promise.allSettled(promises)
.then(results => {
//do stuff with results
})
.catch(error => {
//handle error
})
}

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promise3 = Promise.resolve(4);
const promises = [promise1, promise2,promise3];
Promise.allSettled(promises).
then((results) => results.forEach((result) => console.log(result.status)));
// expected output:
// "fulfilled"
// "rejected"
// "fulfilled"

最新更新