32
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);
}) 

出力は次のようになります。

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

take5Second が開始する前に、takes2Second 関数が完全に終了することを期待していました。それがどのように機能するはずですか。私にお知らせください。そして、最後の関数は決して実行されません。ありがとう。

4

5 に答える 5

41

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

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

一連の次の関数に移動するために非同期で呼び出す必要があるコールバック関数は実際には実行されないため (関数のみが実行されます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']
});
于 2013-04-12T10:41:28.793 に答える
17

James が の概要を説明してくれました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')
})
于 2013-04-13T14:29:11.703 に答える
11

非同期シリーズを作成するための私の好ましい方法は、次のように操作配列を使用することです。

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);
}
于 2013-07-24T17:56:06.077 に答える
7
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);
    });
于 2014-05-20T19:21:00.937 に答える
4

ではasync.series、すべての関数が連続して実行され、各関数の統合された出力が最後のコールバックに渡されます。例えば

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
于 2016-04-20T09:11:18.490 に答える