微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 async.each 调用回调函数并处理结果

如何解决从 async.each 调用回调函数并处理结果

我刚刚开始使用 Javascript 和 Node,异步和回调概念不是我现在可以控制的。

我必须为文档数组的每个元素调用一个函数。此函数调用 DB 并为我获取文档注释数组。我想获取所有注释并将它们放在同一个数组中。类似的东西:

Plot[][] farm = new Plot[4][3];
for (int i = 0; i < farm.length; i++) {
  for (int j = 0; j < farm[i].length; j++) {
    farm[i][j] = new Plot("barren",0);
  }
}

关于 getAnnotationsFromDocument 函数,这是它的简化结构:

     //function in an async waterfall
      function(docs,callback){
        let annotationsArray = [];
        async.each(docs,(doc,callback2) => {
          getAnnotationsFromDocument(doc.Id,callback2);
        },function (err,annotations){
          if (err){
            callback(err);
          } 
          annotationsArray = annotationsArray.concat(annotations);
          callback(null,annotationsArray);
        });
        
      },//Next waterfall function

不幸的是,我无法正确编码。在退出 async.each 之前,我无法从函数获取结果。有人能解释一下如何为此构建代码吗?

调试我发现函数 getAnnotationsFromDocument 获取数据并正确执行最后一个 callback(null,result);,但是当我到达 function (err,annotations){ ,注释未定义。

解决方法

好的,我想我明白了:

  • 第一个问题是 async.each 没有像我期望的那样返回回调的结果。与瀑布不同,它只返回错误。我应该更加注意阅读文档。
  • 其次,我必须在 getAnnotationsFromDocument 调用上创建回调以处理结果。
  • 最后,我没有执行对 async.each 回调的调用,因此执行没有到达 async.each 回调,也没有继续执行下一个 async.waterfall 函数。

老实说,我不确定这是一个正确的答案,但它确实达到了我想要达到的目的。

  // function part of an async.waterfall
  function(docs,callback){
    let annotationsArray = [];
    async.each(docs,(doc,callback2) => {    
      getAnnotationsFromDocument(doc._id,function(err,result){
          if (err){
            callback2(err);
          }else{
            annotationsArray = annotationsArray.concat(result);
          }
          callback2();
        })
    },(err) =>{
      if( err ) {
        callback(err);
      } else {
        callback(null,annotationsArray); //to the next waterfall function
      }
    });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。