【问题标题】:NodeJS - Q - How to pass a promise in another promiseNodeJS - Q - 如何在另一个承诺中传递一个承诺
【发布时间】:2016-11-18 01:48:58
【问题描述】:

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

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

我在指定部分中输入了哪些代码? 谢谢

【问题讨论】:

    标签: node.js promise q


    【解决方案1】:

    混合 promisified 和 unpromisified 函数很麻烦,因此 promisify both 低级函数:

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

    【讨论】:

      【解决方案2】:

      应该可以传下去:

      if(count > 0){
          // already seeded
          def.resolve();
      } else{
          def.resolve(seedUsers());
      }
      

      【讨论】:

        【解决方案3】:

        您可以简单地执行 def.resolve(seedUsers()) - resolve 递归地解决承诺。

        但是,写起来更好的风格

        function seedDb(){
            var def = Q.defer();
        
            _checkCountOfUsers(def.resolve);
        
            return def.promise.then(function(count){
                if (count == 0) {
                    return seedUsers();
                }
            });
        }
        

        除了resolve/reject 调用之外,不要在_checkCountOfUsers 回调函数中添加任何内容。真的没有别的了。

        或者直接使用Q's builtin promisification:

        var checkCountOfUsers = Q.nfbind(_checkCountOfUsers), // assuming it actually uses nodebacks
            seedUsers = Q.nfbind(_seedUsersInDb);
        
        function seedDb() {
            return checkCountOfUsers().then(function(count){
                if (count == 0) {
                    return seedUsers();
                }
            });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-25
          • 1970-01-01
          相关资源
          最近更新 更多