2013-04-12 9 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); 
}) 

Wyjście wygląda jak poniżej:node.js async.series jest takie, jak powinno działać?

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 

Spodziewałem funkcję takes2Second aby całkowicie zakończyć przed rozpoczęciem takes5Second. Czy to powinno działać. Proszę daj mi znać. Ostatnia funkcja nigdy nie działa. Dzięki.

Odpowiedz

32

Niezupełnie. Funkcje są wykonywane natychmiast (od razu po oszacowaniu tablicy), dlatego wydaje się, że zaczynają się w tym samym czasie.

Funkcja zwrotna przekazywana do każdej z funkcji do wykonania jest wewnętrzna dla biblioteki asynchronicznej. Wykonujesz go po zakończeniu funkcji, przekazując błąd i/lub wartość. Nie musisz samodzielnie definiować tej funkcji.

Ostatnia funkcja nigdy nie zostanie uruchomiona w twoim przypadku, ponieważ funkcja wywołania zwrotnego, której asynchronizacja wymaga wywołania, aby przejść do następnej funkcji w serii, nigdy nie zostanie wykonana (zostanie wykonana tylko twoja funkcja callbackHandler).

Spróbuj to zamiast:

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

James, dzięki za jasnego wyjaśnienia na to, co się dzieje. Działa po tym, jak wprowadziłem te zmiany zgodnie z sugestią. Czy możliwe jest przekazanie argumentów do tych funkcji? – voicestreams

+3

Przy dalszym czytaniu dokumentów, wygląda na to, że powinienem użyć async.apply do przekazania argumentów funkcji. – voicestreams

13

James dał wam dobry przegląd async.series. Pamiętaj, że możesz ustawień anonimowych funkcji w tablicy seryjnej, a następnie wywołać swoje rzeczywiste funkcje z parametrami

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

Noah, tak i ostatecznie to rozgryzłem. Dzięki za opublikowanie tego tak czy inaczej. – voicestreams

8

mój ulubiony sposób, aby stworzyć serię transmisji asynchronicznej jest za pomocą tablicy operacyjnej następująco;

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

To ciekawe, jak ustawić funkcję .series() z przodu. Lubię to. – tonejac

+0

W jaki sposób 'async.series' wie, że jedna z operacji napotkała błąd? –

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

Witaj w SO, a dzięki za odpowiedź. Ta odpowiedź byłaby o wiele bardziej użyteczna, gdyby została poprawnie sformatowana i wyjaśniona w niewielkim stopniu. Nie chodzi o to, że twoja pomoc nie jest doceniana, ale w tej formie Twoja odpowiedź prawdopodobnie zostanie usunięta z powodu problemów z jakością, która nie przynosi korzyści tobie ani nikomu innemu w społeczności. –

0

W async.series wszystkie funkcje są wykonywane szeregowo skonsolidowane wyjścia każdej z tych funkcji jest przekazywana do końcowego zwrotnego. np

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

wyjściowa:

First Execute.. 
Second Execute.. 
['userPersonalData','userDependentData'] //result 
Powiązane problemy