2017-06-20 99 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'的屬性。我在這裏錯過了很明顯的東西嗎 –