2013-04-12 7 views
24
var async = require('async'); 

function callbackhandler(err, results) { 
    console.log('It came back with this ' + results); 
} 

function takes5Seconds(callback) { 
    console.log('Starting 5 second task'); 
    setTimeout(function() { 
     console.log('Just finshed 5 seconds'); 
     callback(null, 'five'); 
    }, 5000); 
} 

function takes2Seconds(callback) { 
    console.log('Starting 2 second task'); 
    setTimeout(function() { 
     console.log('Just finshed 2 seconds'); 
     callback(null, 'two'); 
    }, 2000); 
} 

async.series([takes2Seconds(callbackhandler), 
       takes5Seconds(callbackhandler)], function(err, results){ 
    console.log('Result of the whole run is ' + results); 
}) 

出力は以下のようになります。node.js async.seriesは、それがどのように動作するのでしょうか?

Starting 2 second task 
Starting 5 second task 
Just finshed 2 seconds 
It came back with this two 
Just finshed 5 seconds 
It came back with this five 

私はtakes5Secondが始まる前に完全に終了するtakes2Second機能を期待していました。 それはそれが働く方法ですか?私にお知らせください。 最後の機能は決して実行されません。ありがとう。

答えて

32

すぐに(配列が評価されるとすぐに)関数を実行しているため、同時に開始するように見えます。

実行される各関数に渡されるコールバックは、asyncライブラリの内部にあります。関数が完了すると、エラーや値を渡して実行します。その関数を自分で定義する必要はありません。

非同期のコールバック関数は、シリーズ内の次の関数に移動するために呼び出す必要があるため、実際には実行されません(callbackHandler関数のみが実行されます)。

代わりにこれを試してみてください:

async.series([ 
    takes2Seconds, 
    takes5seconds 
], function (err, results) { 
    // Here, results is an array of the value from each function 
    console.log(results); // outputs: ['two', 'five'] 
}); 
+1

ジェームス、何が起こっているのあなたの明確な説明に感謝。私がこれらの変更を提案した後で動作します。これらの関数に引数を渡すことは可能でしょうか? – voicestreams

+3

ドキュメントをさらに読むと、async.applyを使用して関数に引数を渡す必要があるようです。 – voicestreams

13

は、ジェームズはあなたにasync.seriesの良い概要を与えました。あなたはその後、シリーズ・アレイ内のセットアップ無名関数をとは非同期シリーズは、次のように演算アレイを使用している作成するための私の好ましい方法のパラメータ

var async = require('async') 
var param1 = 'foobar' 
function withParams(param1, callback) { 
    console.log('withParams function called') 
    console.log(param1) 
    callback() 
} 
function withoutParams(callback) { 
    console.log('withoutParams function called') 
    callback() 
} 
async.series([ 
    function(callback) { 
    withParams(param1, callback) 
    }, 
    withoutParams 
], function(err) { 
    console.log('all functions complete') 
}) 
+0

ノア、はい、私は結局それを理解しました。とにかく投稿していただきありがとうございます。 – voicestreams

8

であなたの実際の関数を呼び出すことができることに注意してください。 async.series

var async = require('async'), 
    operations = []; 

operations.push(takes2Seconds); 
operations.push(takes5seconds); 

async.series(operations, function (err, results) { 
    // results[1] 
    // results[2] 
}); 

function takes2Seconds(callback) { 
    callback(null, results); 
} 

function takes5seconds(callback) { 
    callback(null, results); 
} 
+0

.series()関数をどのように前に置くのは面白いです。私はちょっとそれが好きです。 – tonejac

+0

'async.series'は操作の1つがエラーに遭遇したことをどのように知っていますか? –

6
async.series 
    ([ 
     function (callback) 
     { 
      response=wsCall.post(user,url,method,response); 
      console.log("one"); 
      callback(); 
     } 
     , 
     function (callback) 
     { 
      console.log("two"); 
      //console.log(response); 
      callback(); 
     } 
    ] 
    , 
    function(err) 
    { 
     console.log('Both a and b are saved now'); 
     console.log(response); 
    }); 
+0

ようこそ、あなたの答えに感謝します。この回答は、正しく書式設定され、少し説明されていればもっと便利です。あなたの助けが評価されていないわけではありませんが、あなたの答えはあなたやコミュニティの誰にも利益をもたらさない品質問題のために削除される可能性があります。 –

0

、すべての機能は、直列に実行され、各機能の統合出力は、最終的なコールバックに渡されます。例えば

var async = require('async'); 
async.series([ 
    function (callback) { 
     console.log('First Execute..'); 
     callback(null, 'userPersonalData'); 
    }, 
    function (callback) { 
     console.log('Second Execute.. '); 
     callback(null, 'userDependentData'); 
    } 
], 
function (err, result) { 
    console.log(result); 
}); 

出力:

First Execute.. 
Second Execute.. 
['userPersonalData','userDependentData'] //result 
関連する問題