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-