Где определен обратный вызов async.waterfall

#javascript #node.js #async.js

#javascript #node.js #async.js

Вопрос:

Я использую библиотеку async и использую функцию async.waterfall, сигнатурой которой является async.waterfall([function1,function2,function3],function(err,result){}) . Теперь я понимаю, что результаты каждой функции передаются следующей, а последняя функция обратного вызова выполняется в случае некоторой промежуточной ошибки или по завершении выполнения.

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

Ниже приведен пример фрагмента кода

  async.waterfall([
 function getUserAvatar(callback) {
    console.log("Callback function is "   callback)//print the 
     callback definition function 
    github.search.users({ q: 'airbnb' }, function(err, res) {
        if (err) {
            callback(err, null);
            return;
        }

        var avatarUrl = res.items[0].avatar_url;
        callback(null, avatarUrl);
    });
  },
  function wrapAvatarInHtml(avatarUrl, callback) {
    var avatarWithHtml = '<img src="'   avatarUrl   '"/>';
    callback(null, avatarWithHtml);
}
], function(err, result) {
 if (err) {
    console.error(err);
    return;
 }
console.log(result);
})
  

Когда я выполняю приведенный выше код, строка, в которой я это делаю console.log("Callback function is " callback) , выводит приведенное ниже определение.

 function () {
        if (fn === null) throw new Error("Callback was already called.");
        var callFn = fn;
        fn = null;
        callFn.apply(this, arguments);
    }
  

Теперь я не понимаю, откуда берется это определение. Я также искал это в библиотеке async, но не смог найти.
Кто-нибудь может это объяснить.

Комментарии:

1. Это реализация waterfall , которая вызывает ваши функции с помощью собственной функции обратного вызова. Это необходимо сделать, чтобы он получал уведомление об асинхронном событии успеха / ошибки и мог затем предпринять действие в рамках своего собственного обратного вызова для запуска следующей функции в водопаде и т.д.

2. @trincot, я неправильно истолковал вопрос, я думал, OP запрашивает определение водопада, а не обратный вызов водопада: p

3. Извините, я снова ошибся, то, что вы на самом деле видите, это функция, возвращаемая onlyOnce функцией — github.com/caolan/async/blob/master/dist/async.js#L298

4. @trincot : я согласен с тем, что вы говорите, но когда мы устанавливаем библиотеку async с использованием npm -i async wwe, мы должны получить это определение вместе с ней. Но, к сожалению, я не смог найти это определение.

5. @JaromandaX: Спасибо за ваш ответ. Именно то, что я искал, и это сводило меня с ума…. Я использовал Visual Studio Code для поиска этой функции во всем каталоге …. по-видимому, это плохо справляется с поиском строк во всем каталоге папок. Теперь я его нашел. Спасибо

Ответ №1:

Если вы пройдетесь по коду по этой ссылке. Следующий () определенный — это вызываемый обратный вызов. Это неявно, вам не нужно определять, и это потому, что даже задачи, которые вы передаете в async waterfall, вызываются не вами, а async.waterfall()

Ответ №2:

Вот код библиотеки async waterfall. Вы получите четкое представление о том, как это работает

 exports.default = function (tasks, callback) {
    callback = (0, _once2.default)(callback || _noop2.default);
    if (!(0, _isArray2.default)(tasks)) return callback(new Error('First argument to waterfall must be an array of functions'));
    if (!tasks.length) return callback();
    var taskIndex = 0;

    function nextTask(args) {
        var task = (0, _wrapAsync2.default)(tasks[taskIndex  ]);
        args.push((0, _onlyOnce2.default)(next));
        task.apply(null, args);
    }

    function next(err /*, ...args*/) {
        if (err || taskIndex === tasks.length) {
            return callback.apply(null, arguments);
        }
        nextTask((0, _slice2.default)(arguments, 1));
    }

    nextTask([]);
};
  

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