NodeJS - Q - 如何在另一个承诺中传递承诺

时间:2016-11-17 15:34:50

标签: node.js promise q

我想要回复或将承诺传递给另一个承诺,但我不知道该怎么做。 我的代码:

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;
}

我在指定的部分放了什么代码? 感谢

3 个答案:

答案 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