2015-04-23 47 views
5

我正在開發一個angularJS應用程序,這是我使用此框架的第一個網站。在我的應用程序中,我需要在for循環中進行$ http調用。在下一次迭代之前的循環中,我想等待前一次調用的響應。什麼是最好和簡單的方法來做到這一點。我試過使用callBack,$ q.all(),然後在所有這些只有最後一個請求正在經歷。請幫忙。

注意:我通過$ http調用的API無法排隊請求。

編輯: 我已經嘗試了兩種方法,在這兩種情況下,只有最後一個請求正在成功。你能告訴我我在這裏做什麼錯了嗎?

方法1:

var promiseArray=[]; 

for(var i=0;i<items.length;i++) 
{ 
var promise=services.Post(items[i]); 
promiseArray.push(promise); 
} 

$q.all(promiseArray).then(data) 
{ 
... 
} 

方法2:

var promises = []; 

for (var i = 0; i < items.length; i++) { 

    var deffered = $q.defer(); 
    var promise = services.Post(items[i]); 
    promise.success(function(data) { 
     deffered.resolve(data); 
    }) 
    promises.push(deffered); 
} 

變種結果= $ q.all(承諾);

編輯:2 服務代碼:

Services.Post = function(lineItemId, submitUrl) { 
    var url = (submitUrl) ? submitUrl : Services.serviceUrl; 

    return $http.post(url, { 
     "LineItemID": lineItemId 
    }). 
    success(function(data, status, headers, config) { 
     Services.processResponse(data, status, headers, config); 
    }). 
    error(function(data, status, headers, config) { 

     JL('Angular').error('Error response when calling Service ' + config); 

    }); 
}; 
+0

看看異步LIB(https://github.com/caolan/async),你可以通過browserify /的WebPack /熱蒙 –

回答

5

你可以使用$q.when其中將採取的$http &承諾後,能夠解決它調用內部.then

$q.when(promiseObj).then(callback); 

功能如果有是多重承諾,那麼你可以使用$q.all這將接受承諾&在函數內的所有promise都得到解決時調用函數。

$q.all([promiseObj1, promiseObj2]).then(callback); 

更新

我想你的第一個方法是正確的只缺席了幾件事

  1. for循環條件,這確實造成這將是不確定的額外對象
  2. $q.all應內有功能.then

代碼

var promiseArray=[]; 

for(var i=0; i < items.length - 1;i++) //<-- change from i<items.length 
{ 
var promise=services.Post(items[i]); 
promiseArray.push(promise); 
} 

$q.all(promiseArray).then(function(data) //<-- it should be function in .then 
{ 
    //this will called after all promises get resolved. 
}); 
+0

在瀏覽器上加載的Pankaj嗨,感謝你的迴應,我已經嘗試了上面提到的不同方法。如果有任何問題,請仔細閱讀並糾正我。 –

+0

@AjaySrikanth @AjaySrikanth你的第一種方法看起來很酷......我認爲在角度服務中你沒有返回一個承諾,你必須從服務返回承諾..如果你有任何疑問,那麼..你的角度服務代碼也.. –

+0

感謝您提供幫助,我在這裏複製了我的服務代碼,請您看看它 –