我想要回复或将承诺传递给另一个承诺,但我不知道该怎么做。 我的代码:
function seedUsers(){
var def = Q.defer();
_seedUsersInDb(function(err, users){
if(err){
return def.reject(err);
}
def.resolve(users);
})
return def.promise;
}
function seedDb(){
var def = Q.defer();
_checkCountOfUsers(function(count){
if(count > 0){
// already seeded
return def.resolve();
} else{
// we have to use seedUsers()
// ????????????????????
// how to pass seedUsers() ????
// ????????????????????
}
})
return def.promise;
}
我在指定的部分放了什么代码? 感谢
答案 0 :(得分:2)
混合promisified和unpromisified函数是混乱的,因此默认两个低级函数:
// promisify _seedUsersInDb()
function _seedUsersInDbAsync() {
var def = Q.defer();
_seedUsersInDb(function(err, users) {
if(err) def.reject(err);
else def.resolve(users);
});
return def.promise;
}
// promisify _checkCountOfUsers()
function _checkCountOfUsersAsync() {
var def = Q.defer();
_checkCountOfUsers(function(err, count) {
if(err) def.reject(err);
else def.resolve(count);
});
return def.promise;
}
现在,nodebacks完全从更高级别的代码中消失,有利于promise链。
function seedDb() {
return _checkCountOfUsersAsync.then((count) => {
return (count > 0) ? count : _seedUsersInDbAsync().then((users) => users.length);
});
}
答案 1 :(得分:1)
应该能够传递它:
if(count > 0){
// already seeded
def.resolve();
} else{
def.resolve(seedUsers());
}
答案 2 :(得分:1)
你可以简单地def.resolve(seedUsers())
- resolve
以递归方式解决承诺。
但是,编写
的风格要好得多function seedDb(){
var def = Q.defer();
_checkCountOfUsers(def.resolve);
return def.promise.then(function(count){
if (count == 0) {
return seedUsers();
}
});
}
请勿在{{1}}回调函数中添加resolve
/ reject
个调用。真的没别的。
或者只使用Q's builtin promisification:
_checkCountOfUsers