Асинхронный водопад, получающий ошибку типа, следующий вызов не является функцией

async.waterfall([1,2,3,4].map(function (arrayItem) {
        return function (lastItemResult, nextCallback) {
            // same execution for each item in the array
            var itemResult = (arrayItem+lastItemResult);
            // results carried along from each to the next
            nextCallback(null, itemResult);
        }}), function (err, result) {
        // final callback
    });

так что я новичок в async и пробую простой пример, но получаю эту ошибку, что не так с этим методом TypeError: nextCallback не является функцией

что не так с кодом выше?

2 ответа

Решение

Согласно документации, подпись первой функции должна быть function (callback) и не function (arg1, callback),

Вы можете исправить свою функцию таким образом.

return function (lastItemResult, nextCallback) {
    if (!nextCallback) {
      nextCallback = lastItemResult;
      lastItemResult = 0;
    }

    // same execution for each item in the array
    var itemResult = (arrayItem+lastItemResult);
    // results carried along from each to the next
    nextCallback(null, itemResult);
};

Если вы посмотрите на асинхронные документы, вы увидите следующий пример для async.waterfall:

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

Сравните этот пример с вашим кодом: проблема в том, что первая функция, map Колбэк генерирующий имеет неверную подпись, так как должен принимать только один аргумент.

когда nextCallback(null, itemResult) вызывается, nextCallback не определено

Другие вопросы по тегам