Узел.Асинхронный обратный вызов JS

Я использую асинхронный модуль для управления потоком кода, и это действительно очень мощный lib. Однако, по мере того, как код становится больше и логический поток становится более сложным, я сталкиваюсь с проблемой со слишком большим количеством async_callback для управления. Некоторые псевдо-код для демонстрации проблемы, как показано ниже

async.auto({
   getjobs:function(cb){},
   loopjobs:['getjobs']{
      async.map(jobs,dojob(job, cb_map),cb); 
   },
}, function(err, result) {
    //handle
}); 

function dojob(job, callback) {
    async.auto({
        step1:function(cb){},
        step2:['step1', function(cb) {}],
        step3:['step1', function(cb) {
           moreloops(params, cb);
        }]
    }, callback)
}

function moreloops(params, cb) {
    async.map(params, doloop(param, cb_map), cb);
}

function dbloop(param, cb) {
    //dosomething
    cb();
}

В этом потоке loopssequentialиспользуется комбинация, parallelи conditionalасинхронный обратный вызов из-за необходимости бизнес-логики. Становится довольно трудно устранить неполадки, если какая-либо функция не возвращает обратный вызов по какой-либо причине. Я пытался отладить с помощью logging framework, но очевидно, что это не очень эффективно из-за асинхронной природы узла.js.

Есть ли какой-либо хороший способ

  1. Улучшение потока в кодировании
  2. Определите, в какой функции поток останавливается.

Спасибо!

1 ответ

  1. Несколько способов улучшить отладку

    1. Используйте модуль vasync это как асинхронный, но с лучшей отладкой

    2. vasync может не иметь всех необходимых инструментов, поэтому promisify (bluebird) все обратные вызовы и использовать обещания, чтобы функции возвращали по крайней .thenмере и .catch

    Например, в модуле запроса:

    var request = require('request');
    function makeRequest(cb) {
        request(url, function(err, res, body) {
            cb(err, body);
        });
    }
    

    становится

    var Promise = require('bluebird');
    var request = Promise.promisify(require("request"));
    Promise.promisifyAll(request);
    
    function makeRequest(cb) {
        request(url)
            .then(function(response) {
                var body = response.body;
                cb(null, body);
            })
            .catch(cb);
    }
    

    Просто передайте все успехи .thenи ошибки .catchи передайте ошибки обратно на самый высокий уровень.