在承诺链中使用基于NodeJScallback的函数错误地执行顺序

我试图在承诺链中使用callback函数。 其实原来的代码被分成两个文件,包含更多的代码,但为了使问题清楚,我已经简化成一个简单的文件。

我期待以下代码产生:ABCDEF,但是我得到:ADBEC F.我不明白为什么D被调用之前B,以及如何使代码工作正常!

当我没有调用任何基于callback的函数,只是使用Q.async函数,那么它正在按预期工作!

这里是代码:

var Q = require('q'); var FlakeId = require('flake-idgen'); var biguint = require('biguint-format'); var flakeIdGen = new FlakeId({ id: 0, epoch: 1234567891234 }); var idDec = null; var deferred = Q.defer(); var createId = function() { console.log('A'); flakeIdGen.next(function (err, id) { console.log('B'); if (err) { console.log('Error 1'); deferred.reject(new Error(err)); } else { idDec = biguint(id, 'dec'); deferred.resolve(idDec); } }); return deferred.promise; }; var doSomething = Q.async(function* () { console.log('D'); }); createId().then(function(idDec) { console.log('C'); }).fail(function(err) { console.log('Error 2'); }).then( doSomething().then(function() { console.log('E'); }).fail(function(err) { console.log('Error 3'); }).then(function() { console.log('F'); } )); 

任何帮助赞赏。 谢谢。

问题在于你如何调用doSomething

这段代码应该按你需要的顺序工作

 createId() .then(function(idDec) { console.log('C'); }) .fail(function(err) { console.log('Error 2'); }) .then(function() { // edited as per comments return doSomething(p1, p2); }) .then(function() { console.log('E'); }).fail(function(err) { console.log('Error 3'); }).then(function() { console.log('F'); }); 

使用doSomething像doSomething()将立即执行,而.then(将忽略它,因为它不是一个函数… doSomething一个参数是一个函数… doSomething()作为参数是function

由于我不完全熟悉doSomething函数的内容的语义,上述可能实际上不工作,我没有办法testing该特定的代码

我假设doSomething返回一个值或一个P​​romise