两种Promise resolve实现方式的区别是什么?哪种是正确写法?
结论
两种写法在你当前的使用场景下都是完全正确的,运行效果没有任何区别,只是写法的简洁度和适用场景不同。
两段代码的核心差异
- 第一段代码:给
setTimeout传入了一个匿名箭头函数作为回调,定时器到期时会先执行这个匿名函数,再在函数内部调用resolve(),你可以在这个匿名函数里随意给resolve传递自定义参数,或者添加其他前置逻辑。
对应代码:function longTask(){ return new Promise((resolve, reject) => setTimeout(() => resolve(), 1000) )} longTask().then(() => console.log("done")); - 第二段代码:直接把
resolve函数本身作为回调传给setTimeout,定时器到期时会直接调用resolve,如果需要传参可以直接通过setTimeout的第三个及之后的参数传递,比如setTimeout(resolve, 1000, '返回结果')。你当前的场景没有传参需求,resolve默认收到的参数是undefined,而你的then回调没有接收参数,所以完全感知不到两者的运行差异。
对应代码:function longTask(){ return new Promise((resolve, reject) => setTimeout(resolve, 1000) )} longTask().then(() => console.log("done"));
不同写法的选择建议
- 如果需要在resolve执行前添加额外逻辑(比如打印日志、参数处理、异常判断调用reject等),或者需要给resolve传递自定义参数,选择第一种写法,灵活性更高,示例:
setTimeout(() => { const result = '自定义返回结果' console.log('任务执行完毕,准备resolve') resolve(result) }, 1000) - 如果只是需要延迟触发resolve,不需要额外逻辑也不需要自定义传参,第二种写法更简洁,没有冗余的匿名函数包装,是更推荐的简化写法。
内容的提问来源于stack exchange,提问作者Ran Turner
相关产品推荐
相关产品推荐

