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
相关产品推荐
相关产品推荐

