如何等待所有数据成功回调的多个承诺

时间:2016-04-08 09:58:34

标签: angularjs angular-promise

我有这个API调用,但我没有按照发送时的顺序接收successCallback中的数据。

    for (var i = 0; i < data.length; i++) {
      $http.post('/api/bla/blabla', $.param(data[i]))
        .then(successCallback, errorCallback);
     }

    var successCallback = function (response) {
       /*
       receive data in random order.
       assume its being send / handled so fast, thats its random
       which gets done first.
       */
    };

我可以以某种方式等待接收所有数据,然后将其重新排序为原始排序吗?还是有其他解决方案。

3 个答案:

答案 0 :(得分:5)

使用function getAutoCompleteFunction(columnName) { return function (container) { container.element.kendoAutoComplete({ filter: "contains", autoBind: false, dataTextField: columnName, dataValueField: columnName, valuePrimitive: true, dataSource: container.dataSource }) } 以正确的顺序获取所有数据。

$q.all

将以正确的顺序创建var promiseArray = []; for (var i = 0; i < data.length; i++) { var dataPromise = $http.post('/api/bla/blabla', $httpParamSerializer(data[i])) .then (function (response) { //return data for chaining return response.data; }) ; promiseArray.push(dataPromise); } $q.all(promiseArray).then(function (dataArray) { //dataArray will be in original order //process results here }).catch (function (errorResponse) { //log error }); 。即使单个XHR POST请求可能无法按原始顺序提供,promiseArray服务也将跟踪承诺并以正确的顺序填充数据数组(或在第一个错误时解析拒绝)。

DEMO on JSFiddle

答案 1 :(得分:0)

正如Groben所说,你可以为每个请求创建一个承诺数组,然后你可以使用&#34;当&#34;完成所有操作后回调执行。

答案 2 :(得分:0)

$ http.get('/ someUrl',config).then(successCallback,errorCallback); $ http.post('/ someUrl',data,config).then(successCallback,errorCallback); 你可以尝试这些 请注意响应对象具有以下属性:

data – {string|Object} – The response body transformed with the transform functions.
status – {number} – HTTP status code of the response.
headers – {function([headerName])} – Header getter function.
config – {Object} – The configuration object that was used to generate the request.
statusText – {string} – HTTP status text of the response.

根据你所使用的API,这些也可以工作......