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

时间:2015-06-01 14:35:35

标签: javascript node.js promise q

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

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调用,以便能够遵循执行路径。

我希望它是:

  • createUser
  • createUser done
  • createClient
  • createClient done
  • createClientPartner
  • createClientPartner done

但相反,它是:

  • 的createUser
  • createClient
  • createClientPartner
  • createClientPartner done
  • createUser done
  • createClient done

为什么在前一个承诺未解决时触发了功能?我期待"然后"等到先前的承诺被解决或拒绝继续。我错过了许多重要的承诺吗?

1 个答案:

答案 0 :(得分:5)

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

而不是

createUser(user_data)
  .then(createClient(client_data))
你应该

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