如何基于另一个Promise的结果来resolve或reject当前手动创建的Promise
Promise手动构造时同步内部Promise状态的正确实现
核心实现方案
Promise构造器的resolve方法原生支持接收Promise实例,当你把内部返回的Promise直接传给resolve时,外层Promise会自动接管该内部Promise的状态:内部Promise成功时外层同步成功并返回对应结果,内部Promise报错时外层同步抛出错误,完全不需要手动写then/catch做状态转发。
修正后的完整代码
function process () { return new Promise((resolve, reject) => { // 校验模块是否存在 let module = modules[queueData.module]; if (!module) return reject('module not found: '+queueData.module); // 校验处理器是否存在 let processor = fileProcessors[module.type]; if (!processor) return reject('processor not found: '+module.type); // 直接把内部Promise传入resolve即可实现状态同步 resolve(anotherPromiseFunction()); }) } processFile().catch(e => console.error)
原有写法的问题说明
- 在
new Promise的执行函数(executor)中写的return anotherPromiseFunction()没有任何作用,executor的返回值会被Promise构造函数直接忽略,无法触发外层Promise的状态变更。 - 你当前使用的
.then(e=>resolve(e)).catch(e=>reject(e))属于冗余写法,和直接将内部Promise传入resolve的效果完全等价,没有额外价值。
注意事项
调用reject后建议加return语句,避免状态变更后后续逻辑仍被执行,产生非预期的副作用。
内容的提问来源于stack exchange,提问作者stackers
相关产品推荐
相关产品推荐

