我试图重构以下代码以避免回调 hell ,将其转换为:

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完成
  • createClient
  • createClient完成
  • createClientPartner
  • createClientPartner完成

  • 但是,它是:
  • createUser
  • createClient
  • createClientPartner
  • createClientPartner完成
  • createUser完成
  • createClient完成

  • 当先前的 promise 未解决时,为什么会触发功能?我希望“然后”可以等到以前的 promise 被解决或拒绝后再继续。我是否缺少有关 promise 的重要信息?

    最佳答案

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

    代替

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

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

    09-27 21:49