如何修改JavaScript代码让map返回Promise数组传入Promise.allSettled
问题:如何修改代码使results成为Promise数组并传入Promise.allSettled?
原始代码如下:
function handler(){ const results = [].map((item) => { a(); b(); }) Promise.allSettled(results); } function a() { // 返回Promise } function b() { // 返回Promise } }
我尝试了以下写法,但不确定是否正确:
function handler() { const results = [].map((item) => { const out1 = a(); const out2 = b(); return [...out1, ...out2]; }) Promise.allSettled(results); }
问题分析
- 原始代码的问题:
map的回调函数没有返回值,所以results是由undefined组成的数组,完全不是Promise数组,Promise.allSettled接收这样的数组毫无意义。 - 你尝试的写法错误:
out1和out2是Promise实例,不是可迭代对象,用扩展运算符[...out1, ...out2]会直接抛出错误,因为Promise不能被展开成数组元素。
正确修改方案
根据需求分两种常见场景:
场景1:所有a()和b()的Promise都加入results,等待全部完成
每个map迭代生成两个Promise,最终合并为一维Promise数组:
function handler() { // 用flatMap直接将每个迭代返回的Promise数组扁平化为一维 const results = [].flatMap((item) => { return [a(), b()]; }); Promise.allSettled(results); }
也可以用map加flat()实现:
function handler() { const results = [].map((item) => { return [a(), b()]; }).flat(); Promise.allSettled(results); }
场景2:每个迭代中a()和b()并行执行,结果作为整体
每个迭代返回一个组合Promise,results是这类组合Promise的数组:
function handler() { const results = [].map((item) => { // 用Promise.allSettled包裹,确保单个Promise失败不影响同组另一个 return Promise.allSettled([a(), b()]); // 若要求两个都成功才视为该迭代成功,改用Promise.all: // return Promise.all([a(), b()]); }); Promise.allSettled(results); }
补充说明
- 核心要求是让
map/flatMap的回调返回Promise(或Promise数组),确保results的每一项都是Promise实例,这样Promise.allSettled才能正常工作。 - 注意:如果原数组
[]是空数组,results也会是空数组,实际使用时要替换为有实际元素的数组。
内容的提问来源于stack exchange,提问作者kittu
相关产品推荐
相关产品推荐

