javascript - 在新的 Promise() 构造函数中使用 async/await 是一种反模式吗?

标签 javascript node.js asynchronous async-await

我正在使用 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/

相关文章:

javascript - 无法使用 Chrome 扩展程序弹出窗口中的按钮打开新选项卡

javascript - 如何将 'setReadyOnly' 用于 ACE 编辑器的特定 session

javascript - 将 useState 与 setInterval 内的 if 条件一起使用不起作用

mysql - 使用sequelize 连接到aws rds 时连接被拒绝

node.js - nodejs websocket检测断开连接的套接字

javascript - 在 Meteor 1.3+ 中使用异步

javascript - 异步代码执行解释

javascript - JavaFX WebEngine 和 Pushbullet 身份验证

javascript - RxJS - 如何积累数据并对其采取行动,而无需多个回调

python - 如何异步处理 Tornado 中的流数据,同时同步处理响应代码?