我正在尝试重构以下代码以避免回调地狱,将其转换为:
其他方法都有相同的console.log调用,以便能够跟踪执行路径。
我期望它是:
- createUser - createUser完成 - createClient - createClient完成 - createClientPartner - createClientPartner完成
但实际上是:
- createUser - createClient - createClientPartner - createClientPartner完成 - createUser完成 - createClient完成
为什么在前一个promise未解决时会触发这些函数?我希望"then"等待前一个promise被解决或拒绝后才继续。我是否忽略了关于promises的重要内容?
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的重要内容?