2014-02-21 55 views
2

我有一個異步函數返回一個隨機的學生。現在我想要一個返回兩個獨特學生的函數 - 我的問題的來源。node q promise遞歸

getTwoRandom = function(req) { 
     var deferred = Q.defer(); 

     Q.all([ 
      Student.getRandom(req), 
      Student.getRandom(req) 
      ]) 
     .then(function(students){ 
      if(students[0]._id !== students[1]._id) { //check unique 
       deferred.resolve(students); 
      } else { 
       //students are the same so try again... this breaks 
       return getTwoRandom(req); 
      } 
     }); 

     return deferred.promise; 
    }; 

再往我有這樣的事情:

getTwoRandom(req).then(function(students) { 
    //do what I want... 
}); 

問題是,當我做return getTwoRandom(req);.then()功能下降的線犯規火...這是返回不同的承諾,.then()心不是使用?

回答

2

你已經過於複雜也頗有幾分:)

你可以不喜歡這樣,而不是:

getTwoRandom = function(req) { 
    return Q.all([ 
     Student.getRandom(req), 
     Student.getRandom(req) 
    ]).then(function(students) { 
     if(students[0]._id !== students[1]._id) { 
      return students; 
     } else { 
      return getTwoRandom(req); 
     } 
    }); 
}; 

現在,爲什麼這項工作? Q.all的結果總是一個新的承諾(不需要創建一個新的延期)。無論你返回什麼樣的價值(ike students)都將包裹在這個新的承諾中。如果返回實際承諾(如getTwoRandom(req)),那麼該承諾將被退回。這聽起來像你想做的事情。

+0

困惑的B/C這不是返回一個承諾,讓我使用後續...?後續的代碼是什麼樣的? – jaredrada

+0

你是什麼意思?它絕對會回報一個承諾。就像我上面描述的那樣,'Q.all'返回一個承諾,我們正在返回。 – Jakob

+0

再往下看,你會完全像你自己描述的那樣使用它。 – Jakob