web-dev-qa-db-fra.com

node.js async.series est-ce ainsi que cela est censé fonctionner?

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

La sortie ressemble à ci-dessous:

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

Je m'attendais à ce que la fonction takes2Second se termine complètement avant le démarrage de takes5Second. Est-ce ainsi que cela est censé fonctionner? S'il vous plaît, faites-moi savoir. Et la fonction finale ne s'exécute jamais. Merci.

30
voicestreams

Pas assez. Vous exécutez les fonctions immédiatement (dès que le tableau est évalué), c'est pourquoi elles semblent démarrer en même temps.

Le rappel passé à chacune des fonctions à exécuter est interne à la bibliothèque asynchrone. Vous l'exécutez une fois votre fonction terminée, en transmettant une erreur et/ou une valeur. Vous n'avez pas besoin de définir cette fonction vous-même.

La fonction finale ne s'exécute jamais dans votre cas car la fonction de rappel qu'async a besoin de vous pour appeler pour passer à la fonction suivante de la série n'est jamais réellement exécutée (seule votre fonction callbackHandler est exécutée).

Essayez plutôt ceci:

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

James vous a donné un bon aperçu de async.series. Notez que vous pouvez configurer des fonctions anonymes dans le tableau série, puis appeler vos fonctions réelles avec des paramètres

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')
})
16
Noah

Ma façon préférée de créer la série asynchrone utilise le tableau opérationnel comme suit;

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);
}
9
user2122112
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);
    });
6
AliPrf

Dans async.series, toutes les fonctions sont exécutées en série et les sorties consolidées de chaque fonction sont passées au rappel final. par exemple

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

Sortie:

First Execute..
Second Execute..
['userPersonalData','userDependentData'] //result
3
vineet