2016-11-17 12 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

はちょうどに沿って、それを渡すことができるはず ありがとう:promisifiedとunpromisified機能をミキシング

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

したがって両方低レベルの機能を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あなたのより高いレベルのコードから完全に消えて、約束を守ります。再帰的に約束を解決しないresolve -

function seedDb() { 
    return _checkCountOfUsersAsync.then((count) => { 
     return (count > 0) ? count : _seedUsersInDbAsync().then((users) => users.length); 
    }); 
} 
1

あなたは、単にdef.resolve(seedUsers())を行うことができます。

しかし、それは_checkCountOfUsersコールバック関数でresolve/reject通話以外のものを置かないでください

function seedDb(){ 
    var def = Q.defer(); 

    _checkCountOfUsers(def.resolve); 

    return def.promise.then(function(count){ 
     if (count == 0) { 
      return seedUsers(); 
     } 
    }); 
} 

を書くためのより良いスタイルです。本当に何もない。

それとも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(); 
     } 
    }); 
}