2015-07-14 6 views
0

Я пытаюсь немного поиграть с функцией узла и асинхронного водопада. Это мой код:Функция Async Waterfall вызывает только обратный вызов

var async = require('async'); 

var waterfall = function (req, res) { 
    async.waterfall([ 
     _function1(req), 
     _function2, 
     _function3 
    ], function (error, success) { 
     if (error) { alert('Something is wrong!'); } 
     console.log("success"); 
     return alert('Done!'); 
    }); 
}; 

function _function1 (req) { 
    return function (callback) { 
     var something = req.body; 
     console.log("first"); 
     callback (null, something); 
    } 
} 

function _function2 (something, callback) { 
    return function (callback) { 
     console.log("second"); 
     var somethingelse = function() { }; 
     callback (err, somethingelse); 
    } 
} 

function _function3 (something, callback) { 
    return function (callback) { 
     console.log("third"); 
     var somethingmore = function() { }; 
     callback (err, somethingmore); 
    } 
} 

waterfall(function(){}, function(){}); 

Но на выходе я получаю только «первый». Почему другие вызовы не вызываются?

ответ

1

Вам не следует возвращать функцию с _function2 и _function3. Причина это делается для _function1 должен пройти req в (что может быть сделано в более эффективные способы, смотри ниже):

function _function2 (something, callback) { 
    console.log("second"); 
    var somethingelse = function() { }; 
    callback (err, somethingelse); 
} 

function _function3 (something, callback) { 
    console.log("third"); 
    var somethingmore = function() { }; 
    callback (err, somethingmore); 
} 

Чтобы получить req в водопад, вы могли бы использовать это:

async.waterfall([ 
    function(callback) { return callback(null, req); }, 
    _function1, 
    _function2, 
    _function3 
], ...); 

Или (я бы предпочел):

async.waterfall([ 
    _function1.bind(this, req), 
    _function2, 
    _function3 
], ...); 

в обоих случаях вам не нужно будет возвращать функцию из _function1 либо:

function _function1 (req, callback) { 
    var something = req.body; 
    console.log("first"); 
    callback (null, something); 
} 
Смежные вопросы