在promise链中使用基于NodeJS回调的函数执行顺序错误

时间:2015-11-23 08:29:48

标签: javascript node.js

我正在尝试在promise链中使用回调函数。实际上原始代码分为两个文件并包含更多代码,但为了使问题清楚,我将其简化为一个简单的文件。

我期待以下代码生成:A B C D E F,但我得到:A D B E C F.我无法理解为什么在B之前调用D,以及如何使代码按预期工作!

当我没有调用任何基于回调的函数并只使用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');
  }
));

任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:2)

问题是你如何调用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()作为参数是函数的结果

由于我不完全熟悉doSomething函数内容的语义,以上可能实际上不起作用,我无法测试该特定代码

我假设doSomething返回值或Promise