You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Promise.allSettled未文档化行为疑问:为何不识别后续添加的Promise?

为什么Promise.allSettled不识别第三个Promise.resolve(10)?

代码示例:

const promises =[];
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(_=>{promises.push(Promise.resolve(10));resolve(1)}, 100, 'foo'));
promises.push(promise1)
promises.push(promise2)

Promise.allSettled(promises).
  then((results) => results.forEach((result) => console.log(result.value)));

根据ECMAScript官方规范,Promise.allSettled的执行逻辑明确了这种行为:

  • 调用Promise.allSettled(iterable)时,会先将传入的可迭代对象转换为静态快照:先获取可迭代对象的当前长度,再按索引顺序遍历当时存在的元素,收集需要处理的Promise(非Promise值会被包装为已resolve的Promise)。
  • 后续对原数组的修改(比如示例中定时器里向promises添加Promise.resolve(10))不会被纳入处理队列,因为快照在调用方法的瞬间就已生成。

这是Promise所有静态方法(包括Promise.all、Promise.race等)的统一行为,目的是保证异步操作的可预测性,避免因原集合的动态修改导致结果不确定。

内容的提问来源于stack exchange,提问作者Lau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:37:35