我正在使用 async.eachLimit
函数来控制一次操作的最大数量。
const { eachLimit } = require("async");
function myFunction() {
return new Promise(async (resolve, reject) => {
eachLimit((await getAsyncArray), 500, (item, callback) => {
// do other things that use native promises.
}, (error) => {
if (error) return reject(error);
// resolve here passing the next value.
});
});
}
如您所见,我无法将 myFunction
函数声明为异步,因为我无法访问 eachLimit
函数的第二个回调中的值.
最佳答案
你在promise构造函数执行器函数中有效地使用了promise,所以这是Promise constructor anti-pattern .
您的代码是主要风险的一个很好的例子:没有安全地传播所有错误。阅读原因 there .
此外,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 构造函数执行器函数中的任何 immediate 异常都会方便地拒绝新构造的 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
,为什么还要使用过时的并发控制库?
关于javascript - 在新的 Promise() 构造函数中使用 async/await 是一种反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036229/