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

4
我正在尝试重构以下代码以避免回调地狱,将其转换为:
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未解决时会触发这些函数?我希望"then"等待前一个promise被解决或拒绝后才继续。我是否忽略了关于promises的重要内容?
1个回答

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

不要传递:

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

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

谢谢,Denys,它起作用了。我会自己深入研究一下。变量依赖是我必须在这段代码中修复的另一个问题。一步一步来。感谢您的指点。 - Francisco Canela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接