如何在caolan async中使用await?

Posted

技术标签:

【中文标题】如何在caolan async中使用await?【英文标题】:How to use await inside caolan async? 【发布时间】:2021-10-10 07:53:50 【问题描述】:

我想在async.Series 中使用await 方法

这是我的节点 js 代码

const async = require("async");

async.eachSeries(myArr, function (arr, callback) 

    let test = await db.collection('coll').findOne( _id: arr ); //I couldn't use await here

    callback(null, test);

, function (err) 
    console.log("Done");

);

我试过了


async.eachSeries(myArr, async function (arr, callback) 

    let test = await db.collection('coll').findOne( _id: arr ); //It not working here

    callback(null, test);

, function (err) 
    console.log("Done");

);

async.eachSeries(myArr, async.asyncify(async(function (arr, callback) 

    let test = await db.collection('coll').findOne( _id: arr ); //It not working here

    callback(null, test);

)), function (err) 
    console.log("Done");

);

如果方法错误,请纠正我,或者让我知道如何在每个异步内部实现等待。

【问题讨论】:

【参考方案1】:

正如asyncdocument所说:

使用 ES2017 异步函数 Async 接受异步函数 接受一个节点样式的回调函数。但是,我们不会通过它们 回调,而是使用返回值并处理任何承诺 拒绝或抛出错误。

如果你仍然把callback函数作为eachSeries 的回调函数的第二个参数传递,它就不会按预期工作了。只需删除 callback 并返回结果:

async.eachSeries(myArr, async (arr) =>  // remove callback parameter
  const test = await db.collection('coll').findOne( _id: arr ); // wait the response
  // ...
  return test; // return response
, function (err) 
  console.log("Done");
);

或者只使用for...loop 而不是eachSeries

// inside a async function
for (const i of myArr) 
  const test = await db.collection('coll').findOne( _id: arr );
  // Do something with `test`


console.log("Done");

【讨论】:

【参考方案2】:

为什么要将回调与承诺混合使用?

正确的方法是使用异步迭代器符号。

如果不是第一次尝试将是有效的

eachSeries(array, async function(arr, cb) 
   await ....
);

【讨论】:

以上是关于如何在caolan async中使用await?的主要内容,如果未能解决你的问题,请参考以下文章

async/await小知识点

如何在 mongoose 中使用 async/await

Javascript 如何在 mysql 中使用 Async/Await

如何使用 async/await 处理错误?

如何在 Vue.js 中使用 async/await?

JS255- 如何在 JS 循环中正确使用 async 与 await