2017-01-10 10 views
0

オブジェクトの配列に対して非同期ループasync.eachを実行しようとしています。 配列内の各オブジェクトで、(promisesを使用して)2つの関数を順番に実行しようとしています。問題は、async.eachが最初のキーワードに対してのみ実行されることです。async.eachは約束を使用すると反復しません

次のコードでは、getKeywordsはファイルからいくつかのキーワードをロードしてから、キーワードオブジェクトの配列を返します。各キーワードオブジェクトは、検索を行うsearchKeywordに入れられます。検索結果はInsertSearchResultsを使用してデータベースに格納されます。

私の考えでは、各キーワードを並行して処理し、検索機能と挿入機能をリンクする必要があります。

getKeywords(keys).then(function(keywords) { 
    async.each(keywords, function(keywordObject, callback) { 
     searchKeyword(keywordObject).then(function(searchResults) { 
      return insertSearchResults(searchResults, db, collections); 
     }).then(function(result) { 
      console.log("here"); 
      callback(); 
     }) 
    }) 
}) 
+0

「エラー」をキャプチャするオプションのコールバックを呼び出せますか? –

答えて

0

.then()コールバックのみを使用しているため、正常に処理されます。

さらに、エラーを処理するために.catch()コールバックを追加する必要があります。

ほとんどの場合、処理されず何も起こらないエラーが発生します。例えば

  // ... 
     }).then(function(result) { 
      console.log("here"); 
      callback(); 
     }).catch(function (error) { 
      console.log('Error:', error); 
      callback(error); 
     }); 
0

それは私がgetKeywords機能でエラーをしたことことが判明しました。 ファイルから読み込んで、各行を繰り返し、forループを使用して結果を配列にプッシュしていました。この配列は、関数によって返されました。

async.eachは完全に動作していましたが、繰り返し処理するために長さ1の配列しか受け取りませんでした。私が助けた問題を書き出すasync.eachループにループのため

function getKeywords(keywordsFilename){ 
    //get keywords from the file 
    return new Promise(function (resolve, reject) { 
     var keywords = []; 
     fs.readFile(keywordsFilename, function read(err, data) { 
      if (err) { 
       reject(err); 
      } 
      content = data.toString(); 
      var lines = content.split("\n"); 
      async.each(lines, function(line, callback) { 
       if (line[0] === "#" || line == "") { 
        callback(); 
       } 
       else { 
        keywords.push(extractKeyword(line)); 
        callback(); 
       } 
      }, function (err) { 
       resolve(keywords); 
      }); 
     }); 
    }); 
} 

を変更することで、この問題を修正

、私は質問を削除する必要がある場合は私に知らせてください。

あなたのお役に立てありがとうございますMukesh Sharmaとrsp。

関連する問題