Node.js Q 承诺 then() 链接不等待
Node.js Q promises then() chaining not waiting
我正在尝试重构以下代码以避免回调地狱,将其转换为:
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 调用,以便能够遵循执行路径。
我希望它是:
- 创建用户
- 创建用户完成
- 创建客户端
- 创建客户端完成
- 创建客户合作伙伴
- 创建客户合作伙伴完成
但相反,它是:
- 创建用户
- 创建客户端
- 创建客户合作伙伴
- 创建客户合作伙伴完成
- 创建用户完成
- 创建客户端完成
为什么之前的promise还没解决就触发了函数?我希望 "then" 等到之前的承诺得到解决或拒绝后才能继续。我是否遗漏了关于承诺的重要信息?
问题是你传递的不是函数,而是函数调用的结果。
而不是
createUser(user_data)
.then(createClient(client_data))
你应该
createUser(user_data)
.then(function(user){
createClient(client_data) // no need for the user ? really ?
})
我正在尝试重构以下代码以避免回调地狱,将其转换为:
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 调用,以便能够遵循执行路径。
我希望它是:
- 创建用户
- 创建用户完成
- 创建客户端
- 创建客户端完成
- 创建客户合作伙伴
- 创建客户合作伙伴完成
但相反,它是:
- 创建用户
- 创建客户端
- 创建客户合作伙伴
- 创建客户合作伙伴完成
- 创建用户完成
- 创建客户端完成
为什么之前的promise还没解决就触发了函数?我希望 "then" 等到之前的承诺得到解决或拒绝后才能继续。我是否遗漏了关于承诺的重要信息?
问题是你传递的不是函数,而是函数调用的结果。
而不是
createUser(user_data)
.then(createClient(client_data))
你应该
createUser(user_data)
.then(function(user){
createClient(client_data) // no need for the user ? really ?
})