2014-09-04 74 views
5

所以我有一個方法在一個angularjs服務器,正在調用一個方法,返回一個數組中的每個方法的承諾。我正在使用下劃線_each來遍歷數組。我想等到我才調用的方法最後一行代碼整個陣列處理..

所以......

function ProcessCoolStuff(coolStuffs) 
{ 
var stuff = []; 
_.each(coolStuffs, function(coolStuff) 
{ 
    //Some method using $q to return 
    makeStuffCooler(coolStuff).then(function(coolerStuff) 
    { 
    stuff.push(coolerStuff); 
    }); 
}); 
//Maybe Call a Display Method, or call event ect.. 
ShowAllMyCoolStuff(stuff); 
} 

這當然不行..循環完成和在爲每個項目完成makeStuffCooler之前調用「ShowAllMyCoolStuff」。那麼..與async方法交互的正確方法是什麼,所以我的ShowAllMyCoolStuff方法將等待,直到集合被填充?這可能是我缺乏q $和一般承諾的經驗,但我被卡住了。提前致謝。

+0

值得關注的是,如果你的瀏覽器中運行的角度,你也許可以依靠它有Array.prototype.forEach和Array.prototype.map.But呀,$ q.all是它的在。 – pfooti 2014-09-04 17:49:19

回答

8

你想使用$q.all,它需要一個承諾數組。因此,請使用map而不是each,並將結果傳遞給$q.all(),這會給您一個等待所有人的承諾。您甚至不需要手動填充的stuff數組,但只需使用該新承諾的分辨率值即可。

function processCoolStuff(coolStuffs) { 
    return $q.all(_.map(coolStuffs, makeStuffCooler)); 
} 
processCoolStuff(…).then(showAllMyCoolStuff); 
+2

很好,謝謝。這正是我所需要的。我認爲它與$ q.all有關。另外還有用於擺脫手動填充數組的+1。 – 2014-09-04 18:31:57

0
$q.all([promise1,promise2,promise3,etc]) 
.then(function(results){ 
    alert("This alert will happen after all promises are resolved."); 
}) 
0

當我讀到問題和相應的答案後,我走上了正確的軌道。非常感謝!但是對於最後的工作解決方案,我花了一個小時才能完成所有用例的工作。這就是爲什麼我想分享一個包含鏈接承諾的代碼示例,其中包括一系列承諾等待解決方案。

用例背景是上傳後的服務器端(nodeJs)文件導入。我使用promise來返回適當的http狀態和結果。

readFile: function (fileName) { 
    if (fileName) { 
     var deferred = Q.defer(); 
     var self = this; 
     converter({input: fileName}, function (error, userData) { 
      if (error) { 
       deferred.reject(error); 
      } 
      self.storeUsers(error, userData) 
       .then(function (success) { 
        if (success) { 
         deferred.resolve(success) 
        } 
       }) 
       .fail(function (error) {      
        deferred.reject(error)      
       }); 
     }); 
     return deferred.promise; 
    } 
}, 

storeUsers: function (error, data) { 
    return Q.all(_.map(data, function (users, emailAddress) { 
     var deferred = Q.defer(); 
     userRepository.findUserByEmail(emailAddress, function (user) { 
      //... 
      user.save(function (error) { 
       if (error) { 
        deferred.reject(error); 
       } else { 
        deferred.resolve(emailAddress); 
       } 
      }); 

     }); 
     return deferred.promise; 
    })); 
} 

希望也有幫助!

乾杯 本