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

L'uscita si presenta come di seguito:node.js async.series è che come dovrebbe funzionare?

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 

mi aspettavo la funzione takes2Second di finire completamente prima dell'inizio della takes5Second. È così che dovrebbe funzionare. Per favore mi faccia sapere. E la funzione finale non funziona mai. Grazie.

risposta

32

Non proprio. Stai eseguendo le funzioni immediatamente (non appena viene valutato l'array), motivo per cui sembrano iniziare allo stesso tempo.

Il callback passato a ciascuna delle funzioni da eseguire è interno alla libreria asincrona. Lo esegui una volta completata la tua funzione, passando un errore e/o un valore. Non è necessario definire la funzione da soli.

La funzione finale non viene mai eseguita nel tuo caso perché la funzione di callback che async richiede di invocare per passare alla funzione successiva della serie non viene mai eseguita (solo la tua funzione callbackHandler viene eseguita).

Prova a modificare:

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, grazie per la vostra spiegazione chiara su quello che sta succedendo. Funziona dopo aver apportato tali modifiche come suggerito. È possibile passare argomenti a queste funzioni? – voicestreams

+3

Su ulteriore lettura dei documenti, sembra che dovrei usare async.apply per passare argomenti a funzioni. – voicestreams

13

James ti ha dato una buona panoramica di async.series. Si noti che è possibile impostare funzioni anonime nella matrice di serie e quindi chiamare le funzioni attuali con i parametri

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, sì alla fine l'ho capito. Grazie per averlo pubblicato comunque. – voicestreams

8

mio modo preferito per creare la serie asincrona è con un array operativa come segue;

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

È interessante il modo in cui si mette in primo piano la funzione .series(). Mi piace un po '. – tonejac

+0

In che modo 'async.series' sa che una delle operazioni ha incontrato un errore? –

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

Benvenuti in SO, e grazie per la vostra risposta. Questa risposta sarebbe molto più utile se fosse stata formattata correttamente e spiegata un po '. Non che il tuo aiuto non sia apprezzato, ma così com'è, la tua risposta sarà probabilmente rimossa a causa dei suoi problemi di qualità, che non sono di beneficio né a te né a nessun altro nella comunità. –

0

In async.series, tutte le funzioni sono eseguite in serie e le uscite consolidati di ciascuna funzione viene passato al callback finale. per esempio

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

uscita:

First Execute.. 
Second Execute.. 
['userPersonalData','userDependentData'] //result 
Problemi correlati