2016-10-27 5 views
1

この質問は私のprevious questionへの回答と関連しています。 @robertklepは.map()の代わりにmapLimit()を使用することをお勧めします。.map()は大量のデータを扱うことができず、その解決策はすべて問題なく動作するからです。しかし、私は自分のコードを再構築しましたが、今度は.<fn>Limit()の関数のどちらも最初のループの繰り返しの後には実行されません。私はここに何かを逃していますかasync。 <fn>最初のiteratonループの後の制限停止

var proccesBook = function(file, cb) { 
    testFile(file, function (epub) { 
     if (epub) { 
      getEpuData(file, function (data) { 
       insertBookInDB(data) 
      }) 
     }else{ 
      cb(file) 
     } 
    }) 
} 

async.mapLimit(full_files_path, 10, proccesBook, function(err){ 
    if(err){ 
     console.log('Corrupted file', err); 
    } else { 
     console.log('Processing complete'); 
    }; 
}) 
// ---> only runs for the first 10 series data 
+1

- ' insertBookinDB'は、コールバックを必要としないのですか?また 'else'ブランチでは、' async'がコールバック規約に従うので、エラーオブジェクトを最初のパラメータとして呼び出して 'cb'を呼び出す必要があります。 'cb(null、file)'。 – cejast

+0

@cejast、ありがとう – efirvida

答えて

2

あなたの主な問題は、あなたがprocessBookの成功ブランチにcbを呼び出すことはありませんです。コントロールフローでは、ワーカー関数呼び出しごとにコールバックを1回だけ呼び出す必要があります。

その他asides:

  • あなたが結果を必要としていないようですので、eachLimitで結構です
    • のみmapLimitを必要としますが、各ワーカーの結果が必要な場合
  • ますコールバックを呼び出す際の標準のエラーファースト規約に従う必要があります。 cb(file)はエラーと解釈され、残りの処理は行われません。あなた `proccesBook`機能については

var proccesBook = function(file, cb) { 
    testFile(file, function (epub) { 
     if (epub) { 
      getEpuData(file, function (data) { 
       insertBookInDB(data) 
       cb() // This is what you were missing 
      }) 
     }else{ 
      cb() 
     } 
    }) 
} 

async.eachlimit(full_files_path, 10, proccesBook, function(err){ 
    if(err){ 
     console.log('Corrupted file', err); 
    } else { 
     console.log('Processing complete'); 
    }; 
}) 
+0

はい!それはプロブレンを解決してくれてありがとう。 – efirvida

関連する問題