2016-01-13 70 views
0

我想要做的事:得到一個項目列表(從API),請求每個項目的狀態。並呼籲應該代表我的項目的全球狀態的回調。非承諾

如何,我試圖做到這一點:第一承諾得到的所有項目,並在第一然後我想呼籲每個項目getProjectStatus誰應該得到的地位。我想我的第二個然後等我完成了迭代(我嘗試了很多不同的事情,但我的第二個總是在之前被調用)。我不知道這是否是一個很好的承諾...

var that = this; 
    var options = { url : this.host + "projects", json : true } 

    var finalStatus = "SUCCESS"; 

    // first promises 
    return request(this.options) 
    .then(function(projects) { 
    projects.forEach(function(element, index, array) { 
     // second promises 
     that.getProjectStatus(element.id, function(status){}) 
     .then(function(status) { 
      if(status != "SUCCESS) 
      { 
       finalStatus = "FAILURE"; 
      } 
     }); 
    }) 
    }) 
    .then(function(){ 
     callback(finalStatus)}); 
+0

的可能的複製[如何所有的JavaScript ES6承諾後運行得到解決(http://stackoverflow.com/questions/26634654/how-to-run-all-javascript-es6-promises-are-resolved) – Mathletics

+0

我認爲這個問題有很多版本,但這是我能找到的第一個版本。無論如何,這在文檔中僅作爲示例在每個Promise實現中進行了介紹。 – Mathletics

+0

嘿Mathletics,我意識到Promise.all,但我沒有正確使用它,我沒有找到在我的重疊中使用它的方式(正如我所說我試圖在第二秒中實現它)。謝謝 – rad

回答

1

這應該讓你去。您只需在第二個承諾數組上使用Promise.all。我可能沒有理解getProjectStatus確切的語法,但你可以調整,我希望如果需要的話

return request(this.options) 
    .then(function(projects) { 
    return Promise.all(projects.map(element => that.getProjectStatus(element.id)) 

    .then(function(){ 
     callback(finalStatus)}); 
+0

哦,真棒我嘗試Promise.all在第二次然後(添加承諾數組並返回它)沒有運氣。 – rad