2016-09-19 52 views
1

在我的AngularJS應用程序中,我有一個參數數組(例如某些ID),它應該用作ajax調用隊列的參數。問題是數組可能包含600多個項目,如果我只是遞歸地使用forEach循環進行ajax調用,瀏覽器頁面最終會在每個請求解析之前停止響應,因爲每個響應都會更新視圖。有沒有一種技術可以允許發送ajax請求,例如,一次5個請求,並且只有當這些請求完成後,繼續執行下一個5?JavaScript,AngularJS - 發送多個同步ajax調用

+0

你需要更新解決所有視圖完成後或每個視圖完成後? Promise.all ?? –

+0

@IlyaNovojilov - 或第三個選項,在每個「批次」5完成後 –

+0

等待,您計劃發送600個請求? – Bergi

回答

1

我認爲最好的解決辦法是改變端點允許標識的數組,但我想這是不是一種選擇。您可以使用承諾來限制同時請求的數量:

function chunkedAjax(idArray, index, limit) { 
    if(index >= idArray.length) { 
    return; 
    } 
    var index = index || 0; 
    var limit = limit || 5; 

    var chunk = idArray.slice(index, limit); 
    var promises = []; 

    angular.forEach(chunk, function(id) { 
    var deferred = $q.defer(); 
    promises.push(deferred.promise); 
    makeAjaxCall(id).then(function(response){ 
     deferred.resolve(); 
    }); 
    }); 

    $q.all(promises).then(function() { 
    chukedAjax(idArray, index + limit, limit); 
    }); 

} 

這是一個遞歸函數,所以要警告。在投入生產之前,我會進行大量調試。

你也可能需要修改makeAjaxCall函數返回一個承諾,如果它不已經,或者通過承諾對象,以便它可以當Ajax調用完成

+0

這沒有竅門! –

1

看看$q.all()。這可以讓您在多個請求完成時執行回調。因此,您可以遞歸執行有限數量的請求,直到處理完所有項目。

+0

重新讀取問題 - OP想限制活動請求的數量 –

+0

您是對的。但我的想法是分割600個請求,並使用一些遞歸,如果成功回調被調用,下一個'n'請求被觸發。 – kenda

+0

看起來像「回答:缺少這個信息 –