Node.js Q 承诺 then() 链接不等待

Node.js Q promises then() chaining not waiting

我正在尝试重构以下代码以避免回调地狱,将其转换为:

createUser(user_data)
  .then(createClient(client_data))
  .then(createClientPartner(clientpartner_data))
  .then(function(data) {
    cb(null, _.pick(data,['id','username']));
  }, function(error) {
    cb(error);
  });

如您所见,我为每个步骤创建了一个方法:

function createUser(user_data) {
  console.log('createUser');
  var deferred = Q.defer()

  new db.models.User.create(user_data, function(err, user) {
    console.log('createUser done');
    if (!!err)
      deferred.reject(err);
    else {
      client_data['id'] = user.id;
      deferred.resolve(user);
    }
  });

  return deferred.promise;
}

其他方法具有相同的 console.log 调用,以便能够遵循执行路径。

我希望它是:

但相反,它是:

为什么之前的promise还没解决就触发了函数?我希望 "then" 等到之前的承诺得到解决或拒绝后才能继续。我是否遗漏了关于承诺的重要信息?

问题是你传递的不是函数,而是函数调用的结果。

而不是

createUser(user_data)
  .then(createClient(client_data))

你应该

createUser(user_data)
.then(function(user){
    createClient(client_data) // no need for the user ? really ?
})