2016-11-17 190 views
0

我希望将承诺还给承诺人,但我不知道如何去做。 我的代码:NodeJS - 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; 
} 

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

回答

1

应该可以只是把它传递:

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

混合promisified和unpromisified功能是凌乱的,因此promisify 低级别的功能:

// 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完全从您的更高级别的代码中消失,转而使用承诺链。

function seedDb() { 
    return _checkCountOfUsersAsync.then((count) => { 
     return (count > 0) ? count : _seedUsersInDbAsync().then((users) => users.length); 
    }); 
} 
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(); 
     } 
    }); 
} 

不要放任何东西,但在_checkCountOfUsers回调函数resolve/reject电话。真的没有别的。

或者只是使用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(); 
     } 
    }); 
}