【问题标题】:Node.js Q promises then() chaining not waitingNode.js Q 承诺 then() 链接不等待
【发布时间】:2015-08-15 01:52:03
【问题描述】:

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

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 完成
  • 创建客户端
  • createClient 完成
  • createClientPartner
  • createClientPartner 完成

但是,它是:

  • 创建用户
  • 创建客户端
  • 创建客户端合作伙伴
  • createClientPartner 完成
  • createUser 完成
  • createClient 完成

为什么在之前的promise还没有resolve的时候会触发函数?我希望“then”等到先前的承诺得到解决或被拒绝才能继续。我是否遗漏了有关承诺的重要内容?

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

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

    而不是

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

    你应该有

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

    【讨论】:

    • 谢谢,Denys,它成功了。我将自己深入了解一下。变量依赖是其他我认为我必须在这段代码中修复的。一步步。谢谢指点。
    猜你喜欢
    • 2015-04-15
    • 2015-06-22
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多