您实际上在promise构造函数执行程序函数内使用了promise,因此这是Promise构造函数anti-pattern。
您的代码很好地说明了主要风险:没有安全地传播所有错误。读为什么在那里。
此外,使用async
/ await
会使相同的陷阱更加令人惊讶。相比:
let p = new Promise(resolve => {
""(); // TypeError
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e)); // Catches it.
天真(错误)的async
等效项:
let p = new Promise(async resolve => {
""(); // TypeError
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e)); // Doesn't catch it!
在浏览器的网络控制台中查找最后一个。
第一个起作用是因为Promise构造函数执行程序函数中的任何立即异常都可以方便地拒绝新构造的Promise(但是.then
在您自己的任何内部)。