2017-06-28 14 views
0

async.eachLimitの使用に問題があります。それは最初の10個の要素については適切に機能しますが、それを過ぎてもそれを続行しません。それは単に終了する。したがって、要素が100個ある場合は、最初の10個だけです。これは明らかに私がコールバックを誤解している問題です。コールバックを含まない外部関数でeachLimitを使用する適切な方法は何ですか?それとも、そのような関数に必要なものはありますか?JavaScriptを正しく使用する方法Async eachLimit

async.eachLimit(items, 10, function(item, callback) { 
     outsideFunction(item.attrOne, item.attrTwo}; 
     //callback(); ---> leads to all running in parallel. 
    }, 
    function(err) { 
     console.log(err); 
    } 
); 
+1

「コールバックを含まない外部関数」とはどういう意味ですか?それは全く非同期ですか?はいの場合、コールバックがないときにどのように終了したのか – Bergi

答えて

0

ここで問題となるのは、非同期でない(または非同期のように動作していない)関数に対して非同期ライブラリを使用していることです。 async.eachLimitは配列内の各項目を調べて、一度にlimitの量だけを実行し、現在の反復が終了したことを示すcallback()が呼び出され、実行する別のものを追加できるのを待ちます。

コード例では、コールバック(非コメント時)は、関数呼び出しが非ブロックであるため、outsideFunctionの呼び出しを試みた直後に呼び出されます。それは、asyncが "完了したと言われている、私は次のものに行く"と言っているので待たずに、100人すべてが同時に試して実行されるだろう。 outsideFunctionが非同期関数の場合、にはコールバックが必要です(または、約束を使用して)実行が完了し、そのコールバック内でasync.eachLimitのコールバックを呼び出した後、一度に10回だけ実行しますあなたは欲しい。ここでは例です:

async.eachLimit(items, 10, function(item, callback) 
{ 
    outsideFunction(item.attrOne, item.attrTwo, function(someResult) 
    { 
     // Your outside function calls back saying it's finished ... 
     callback(); // ... so we tell async we're done 
    }); 
}, 
function(err) 
{ 
    console.log(err); 
}); 

outsideFunctionはあなたの関数ではなく、関数が実際に非同期である場合、それはどちらかの約束を使用するか、あなたが適切非同期機能を書き込みライブラリを見つける必要があります。関数が非同期でない場合、async.eachLimitは機能しません。

あなたの関数であれば、完了したことを伝えるコールバックを返すようにするか、約束を使用してください。

関連する問題