2016-05-04 11 views
0

Ich habe async Modul verwendet, um meinen Code-Flow zu verwalten, und es ist in der Tat eine sehr leistungsfähige lib. Wenn der Code jedoch größer wird und der logische Ablauf komplexer wird, stoße ich auf ein Problem mit zu vielen async_callbacks, die verwaltet werden müssen. Einig Pseudo-Code zur Demo der Frage, wie untenNode.JS 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(); 
} 

In dieser Strömung, eine Kombination aus loops, sequential, parallel und conditional Asynchron-Rückruf wird aufgrund der Notwendigkeit der Geschäftslogik verwendet. Es wird ziemlich schwierig, Fehler zu beheben, wenn irgendeine Funktion aus irgendeinem Grund keinen Rückruf zurückgibt. Ich habe versucht, mit Logging-Framework zu debuggen, aber offensichtlich ist es wegen der asynchronen Natur von node.js nicht sehr effizient.

Gibt es eine gute Möglichkeit, um

  1. die Strömung verbessern bei der Codierung
  2. , bei denen die Ursache funktionieren die Strömung stoppt.

Vielen Dank!

+1

Verzicht Callbacks und verschieben Sie auf Versprechen? Ist das eine Option? – Yerken

+0

Verwenden Sie Versprechen. Vieles, um den Kontrollfluss und die Fehler zu verwalten. – jfriend00

+0

Ich denke, "Ereignisse" sind in dieser Hinsicht auch sehr nützlich. –

Antwort

0

paar Möglichkeiten, Fehlersuche zu verbessern

  1. Verwenden vasync module Es ist wie async ist aber mit besseren Debuggen

  2. vasync nicht alle Werkzeuge, die Sie so brauchen kann promisify (bluebird) alle Rückrufe und Versprechungen verwenden, so dass Funktionen Rück mindestens .then und .catch

beispielsweise in Anfrage-Modul:

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

wird

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

einfach alle den Erfolg in .then und Fehler in .catch passieren und Fehler zurück an den höchsten Level kommen.