350 - 《Promise.resolve(fn) 和 Promise.resolve().then(() => fn) 有何不同》

发布于 2023年10月8日

背景是,我们需要在构建工具中增加一个配置项,把 import() 转成 require(),但 import() 返回的是 Promise,而 require 是同步执行的,所以就要给 require() 包装成 Promise 返回。

这时有两种选择,

1、Promise.resolve(require('foo'))
2、Promise.resolve().then(() => require('foo'))

咋一看效果相同,我的同事 review 实现时也提出了这个疑问。但如果你的 Promise 功力足够深,还是会发现有些不同的。

有两点不同,1)错误处理,2)执行方式。通过下面这个例子就能看到了。

function fn() {
    throw new Error('error');
}
Promise.resolve(fn()).catch(e => {
    console.error(`catch: ${e.message}`);
});
console.log(2);
// /private/tmp/sorrycc-5Rtzd4/test.js:11
//    throw new Error('error');
//    ^
// Error: error
//     at fn (/private/tmp/sorrycc-

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。