2016-12-07 26 views
-1

私はnodejsを初めて使い、何かを印刷するためにforループ内の関数を呼び出そうとしています。Node.js - ループ非同期

var mysql = require("mysql"), 
    async = require("async"); 

function test() { 

    setTimeout(function() { 
     console.log('boo'); 
    }, 100) 
} 

con.query('SELECT * FROM database', function(err, rows){ 
    if(err) throw err; 

    for (var i = 0; i < rows.length; i++) { 
     console.log('Processing ID: ' + rows[i].id); 
     test(); 
    } 

}); 

ループがブーイングを待っていないように見えますが、すべての値が継続しているようです。出力は次のとおりです。

Processing ID: 1 
Processing ID: 2 
boo 
boo 

しかし、私が本当に欲しいのはこれです:

Processing ID: 1 
boo 
Processing ID: 2 
boo 

私もこのように非同期ライブラリを使用してみました:

async.each(rows, function(rows, callback) {   
    console.log('Processing ID: ' + rows.id); 
    test(); 
    callback(); 

}, function(err) { 
    if(err) { 
     console.log('A file failed to process'); 
    } else { 
     console.log('All files have been processed successfully'); 
    } 
}); 
+0

表示されます。 –

+0

あなたの質問には順序が重要ですか?非同期ドキュメントでは明示的に " "と書かれています。この関数はiterateeを各項目を並行して実行すると、iteratee関数が順番に完了するという保証はありません。 " – aaaaaa

+1

@aaaaaaこれは簡単な例です。このプロセスを理解することができるので、webdriverと:driverを使用しています。待つ(elementLocatedまで... ")。 forは、配置される要素を待つことなく、ループ処理を続行します。 –

答えて

0

setTimeoutは非同期で、ブロックされません。残りのコード基本的には「console.log('boo')を100msで呼び出し、その間に残りのコードを続ける」と言っています。 これはevent loopと関連しています。これは、このtalkで実際によく説明されています。

あなたはコールバックが呼び出されるまで、各反復でお待ちしておりますeachSeries

async.eachSeries(
    rows, 
    function(row, callback) { 
     console.log('Processing ID: ' + row.id) 
     setTimeout(function() { 
      console.log('boo') 
      callback() 
     }, 100) 
    }, 
    function(){ 
     // is called when done 
    } 
) 

eachSeriesを使用することができますlibに非同期を使用します。 setTimeoutは非同期なので、そこでコールバックを呼び出す必要があります。

ワーキングJSBin: https://jsbin.com/gequduhoma/1/edit?js,console

+0

彼は出力がこれのように来る理由を尋ねなかった。 – Mahi

+0

@Mahi彼はこうしました: "しかし、これは単純な例なので、私はプロセスを理解することができます。" – MoeSattler

+0

同じ結果を得ています.. –

0

あなたのコードで

Processing ID: a1 
boo 
Processing ID: b2 
boo 
Processing ID: c3 
boo 

問題を印刷し、あなたの問題

const async = require('async'); 
const processingIds = ['a1', 'b2', 'c3']; 

function test(aProcessingId, done) { 
    setTimeout(function() { 
    console.log('Processing ID: ' + aProcessingId); 
    console.log('boo'); 
    done(); 
    }, 100); 
} 

function iteratee(aProcessingId, done) { 
    test(aProcessingId, done); 
} 

async.each(processingIds, iteratee); 

に取り掛かるだろうか、次のとおりです。

async.each(rows, function(rows, callback) {   
    console.log('Processing ID: ' + rows.id); // #1 
    test(); // #2 
    callback(); 

#1- async.eachはすべての行に対してすぐに起動します。そのため、console.logはすべての処理IDに対して直ちに起動します。

#2からtest()はかつて、リスト項目ごとに実行される「0.1秒で、タイプ 『ブー』と言う新しい非同期機能を起動するすべてのプロセスIDが印刷されているので、0.1秒後に、boo年代は