您在Promise 构造函数 executor 函数中有效地使用了Promise,因此这是Promise 构造函数反模式。
您的代码是主要风险的一个很好的例子:没有安全地传播所有错误。阅读为什么在那里。
此外,使用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!
在浏览器的 Web 控制台中查看最后一个。
第一个有效,因为Promise 构造函数 executor 函数中的任何直接异常都方便地拒绝了新构造的 Promise(但在任何.then
你自己的内部)。
第二个不起作用,因为async
函数中的任何直接异常都会拒绝函数本身返回async
的隐式Promise。
由于 promise 构造函数执行器函数的返回值未使用,这是个坏消息!
你的代码
没有理由你不能定义myFunction
为async
:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
// do other things that use native promises.
}, error => {
if (error) return reject(error);
// resolve here passing the next value.
});
});
}
但是为什么要使用过时的并发控制库await
呢?