【问题标题】:Iterate over an array using async js and executing a function inside callback to return a single result使用异步 js 遍历数组并在回调中执行函数以返回单个结果
【发布时间】:2020-02-06 01:37:38
【问题描述】:

我正在运行一个 Node Js 服务器,并且我从我的前端收到以下内容:

{
  dataType: "any",
  fechaI: "any",
  fechaF: "any",
  checkedList: [ "any obj","any obj"]
}

我必须遍历 checkedList 数组以获取其所有对象的 action 属性,然后使用导入进行查询

const query = require("./queries.js")

query[item.action](req,res,resp,function(err,data){
            console.log(data)
        })

我想在迭代完成后使用查询的所有结果设置一个变量,我尝试使用 async.each 但查询返回未定义的对象。此外,我获得的内容的所有其他属性也没有正确传递给查询项。

这是我迄今为止尝试过的:

    async.each(checkedList ,function(item, next) {
       let results =[]
 
        query[item.action](req, res, resp, function(err, data) {
            console.log(data)
            results.push(data)
            console.log(results)
            next()
        }.bind({results:results}))
    }, function(err) {
        if (err) console.log(err)
        console.log('done')
    })

console.log(data) 的输出是未定义的,但是 results 确实返回了一个值,但它属于数组的最后一项。在这种情况下我做错了什么?

【问题讨论】:

  • 也可以使用常规循环,因为您希望在所有这些异步执行之后得到结果。否则,创建一堆 Promise 并使用 Promise.all()
  • 所以我必须让查询成为一个承诺,然后我应该将结果映射到数组?
  • 哦,我知道你想做querys。保持async 循环是有意义的。将query 包装在一个Promise 中,即resolved 在results.push(data) 之后。然后将所有这些承诺传递给Promise.all()
  • 你能回答那看起来怎么样吗?会很有帮助的

标签: javascript node.js async.js


【解决方案1】:

在查看您的代码后,我认为,但不确定,您想要执行以下操作:

function whatever(){
  const listData = [];
  return new Promise((resolve, reject)=>{
    async.each(checkedList, (item, next)=>{
      query[item.action](req, res, resp, (err, data)=>{
        listData.push(data);
        if(listData.length === checkedList.length)resolve(listData);
        next();
      });
    }, err=>{
      console.log(err); reject(err);
    });
  });
}
whatever().then(listRes=>{
  console.log(listRes);
});

就个人而言,我只会在您获得所有结果时调用一个函数,而不是返回一些东西:

function whatever(doneFunc){
  const listData = [];
  async.each(checkedList, (item, next)=>{
    query[item.action](req, res, resp, (err, data)=>{
      listData.push(data);
      if(listData.length === checkedList.length)doneFunc(listData);
      next();
    });
  }, err=>{
     console.log(err);
  });
}
whatever(listRes=>{
  console.log(listRes);
});

【讨论】:

  • 当我有一个包含两个或多个项目的数组时,该函数返回一个错误,指出`错误:回调已被调用。`
猜你喜欢
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
相关资源
最近更新 更多