Подтвердить что ты не робот

Серия Nodejs async - передает аргументы в следующий обратный вызов

Когда вы используете асинхронный модуль, как вы можете передать аргументы из предыдущего обратного вызова на следующий?

Вот пример из документов github

async.series({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2}
});
4b9b3361

Ответ 1

Вы можете связать воедино асинхронные функции с помощью функции waterfall асинхронного модуля. Это позволяет вам сказать: "сначала выполните x, затем передайте результаты в функцию y и передайте результаты этого в z". Скопировано из [документов] [1]:

async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback){
        // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback){
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
   // result now equals 'done'    
});

Вам не нужен строго асинхронный модуль для этого; эта функция предназначена для облегчения чтения кода. Если вы не хотите использовать асинхронный модуль, вы всегда можете просто использовать традиционные обратные вызовы.

Ответ 2

Другой вариант - использовать async.auto. С помощью async auto вы можете указать данные зависимости для задачи, и async начнет запускать ее, когда сможет. В README.md есть хороший пример, но вот примерно ваша серия сверху:

async.auto({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    }, 
    // If two does not depend on one, then you can remove the 'one' string
    //   from the array and they will run asynchronously (good for "parallel" IO tasks)
    two: ['one', function(callback, results){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }],
    // Final depends on both 'one' and 'two' being completed and their results
    final: ['one', 'two',function(err, results) {
    // results is now equal to: {one: 1, two: 2}
    }];
});

Ответ 3

Я потратил немало времени на решение этой проблемы, потому что столкнулся с подобной ситуацией. Я попробовал как async.series, так и async.waterfall.

async.series: Используется переменная для совместного использования функций обратного вызова. Я не уверен, что это лучший способ сделать это. Я должен отдать должное Sebastian за его замечательную статью о async.

var async1 = require('async');

exports.asyncSeries1 = function (req, res, callback) {

    var sharedData = "Data from : ";
    async1.series([
            // First function
            function(callback) {
                sharedData = "First Callback";
                callback();
            },
            // Second function
            function(callback){
                console.log(sharedData);
                sharedData = "Second Callback";
                callback();
            }
        ],
        // Final callback 
        function(err) {
            console.log(sharedData);
            if (err) {
                callback();
            }
            callback();
        }
    );
};

async.waterfall: я попытался использовать другую функцию обратного вызова, используя async.apply. Вот фрагмент кода, который помог мне решить проблему. `

var async2 = require('async')

exports.asyncWaterfall1 = function (arg1, arg2, cb) {
    async2.waterfall([
        // async.apply
        async2.apply(assignVariables, arg1, arg2),
        // First callback
        function(arg1, arg2, callback){
            console.log(arg1);
            console.log(arg2);
            arg1 = 5;
            arg2 = 6;
            callback(null, arg1, arg2);
        },
        // Second callback
        function(arg1, arg2, callback){
          // arg1 now equals 'one' and arg2 now equals 'two'
            console.log(arg1);
            console.log(arg2);
            arg1 = 7;
            arg2 = 8;
            callback(null, arg1, arg2);
        }
    ], 
    function (err, arg1, arg2) {
        console.log(arg1);
        console.log(arg2);  
    });
};

// Method to assign variables
function assignVariables(arg1, arg2, callback) {
    console.log(arg1);
    console.log(arg2);
    arg1 = 3;
    arg2 = 4;
    callback(null, arg1, arg2);
};

PS: Кредит.