2017-06-20 101 views
1

我对Node.js比较陌生,仍然围绕着回调和Node.js的异步本质进行了包装。我遇到了一个我无法解决的问题;我已经彻底搜索了溢出并阅读了支持文档,但仍无法使其工作。对数组中的每个对象执行多个异步操作的意外结果

本质上,问题是我有一个对象数组,我想对每个对象应用一系列的异步操作。我查看了Async.js并尝试了各种回调结构,但是我的编译器只是不停地向我大喊。

我的代码的最新版本是:

function processObjects(objects){ 

    console.log(objects); 

    async.forEachOf(objects, function(object, key, callback){ 

     var imageProfile; 
     var files = {}; 

     function readFile(callback){ 
      fm.mdfil("templates/no_object.jpg", function(result) { // Read metadata from no_object.jpg template 
       console.log("check1"); 
       files['name'] = object + "_" + timestamp + ".jpg"; // file.name = object.id + timestamp 
       files['type'] = ".jpg"; 
       files['size'] = result.size; 
       callback(); 
      }); 
     } 

     function updateFileProfileAgain(result, callback){ 
      console.log("check2"); 
      var obj = []; 
      obj.push(object); 
      f.insF(req.user._id, files.name, "", "", files.type, files.size, "", "", "", timestamp, obj, function(result){ // Add record of the image to the Files Collection 
       callback(null, result); 
      }); 
     } 

     function updateImageRef(result, callback){ 
      console.log("check3"); 
      o.updSO(object, "imageRef", imageProfile.insertedId, function(result){ 
       callback(null, result); 
      }); 
     } 

     function updateObjectImage(result, callback){ 
      console.log("check4"); 
      o.updSO(object, "objectImg", files.name, function(result){ 
       callback(null, result); 
      }); 
      callback(); 
     } 

     readFile(function(callback){ 
      updateFileProfileAgain(function(result, callback){ 
       updateObjectImage(function(result, callback){ 
        updateImageRef(function(result, callback){ 
         console.log(result); 
        }); 
       }); 
      }); 
     }); 

     readFile(); 
    }, 
    function(err, result){ 
     console.log("done"); 
    }); 
} 

时间戳是一个全局变量。对象是一个具有唯一ID的数组。实质上,我想解析所有这些唯一ID以给它们自己的图像(在readFile函数中),将该图像的记录添加到单独的集合(updateFileProfileAgain),将插入记录的引用添加到对象的记录(updateImageRef)并最终将图像记录的字符串添加到每个对象的objectImg字段(updateObjectImage)。

该代码的输出与未定义的回调(作为函数)和未定义的结果有所不同。在某些情况下,我确实在客户端上得到了结果,然后它会显示一个对象的更新记录,但不会显示另一个对象的结果(就像文件变量没有更新或者最后一个已知值一样),如下所示:

  • 对象[0]:imageRef: “594912a794c9dc8488292025”
  • 对象[1]:imageRef: “”;

与同为场objectImg等

任何帮助,将不胜感激!

回答

0

您不会将每个函数的结果传递给下一个函数。

此外,回调可能是一个头痛的问题。我建议你使用Promise chaining

Objects.forEach(function (object) { 
    readFile(object) 
    .then(function(file) { return updateFileProfileAgain(file) }) 
    .then(function(result) { return updateObjectImage(result) }) 
    .then(function(image) { return updateImageRef(image) }); 
}); 

随着ES6

Objects.forEach((object) => { 
    readFile(object) 
    .then(file => updateFileProfileAgain(file)) 
    .then(result => updateObjectImage(result)) 
    .then(image => updateImageRef(image)); 
}); 
+0

喜马蒂亚斯,感谢您的回答。我试着实现promise,但是我的控制台告诉我它不能读取'then'的属性。我在这里错过了很明显的东西吗 –