2017-06-20 10 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を使用することをお勧めします。 ES6

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

こんにちはマティアスで

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

、あなたの答えに感謝。私は約束を実行しようとしましたが、私のコンソールは「それから」のプロパティを読み取ることができないと私に伝えます。私はここで何かを見逃していますか? –

関連する問題