2016-04-08 26 views
0

Bu API çağrısına sahibim, ancak verileri successCallback benim gönderdiğim sırayla almıyorum. Tüm Veriler İçin Birden Fazla Vaatte Bekleniyor Başarı Geri Bildirimleri

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. 
     */ 
    }; 

ben bir şekilde tüm veriler alınacak bekleyin ve sonra özgün sipariş onu yeniden düzenlemek mi? ya da başka bir çözüm var.

+1

Bunu yapabilirsiniz ...

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. 

Ve bunlar da ayrıca üzerinde çalıştığınız API bağlı çalışabilir, ancak olurdu: Eğer yanıt nesne bu özelliklere sahip olan bu notu deneyebilirsiniz * çok, çok fazla * tüm verileri tek bir istekte göndermek daha kolay. –

+1

bu soruyu http://stackoverflow.com/questions/21310964/angularjs-q-all adresinde bulabilirsin $ q.all kodunu kullanarak tüm vaatlerinizi çözdüğünüzde kodu geri alabilirsiniz – Groben

+0

Birlikte çalıştığım arka plan aşağıdakileri desteklemiyor:/her seferinde bir tane alması gerekiyor. –

cevap

5

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 
}); 

promiseArray

doğru sırayla oluşturulur. Tek tek XHR POST istekleri orijinal sırada sunulmayabilir olsa da, $q hizmeti vaatleri izler ve veri dizisini doğru sırada doldurur (veya ilk hatada reddedilenleri çözümle).

DEMO on JSFiddle.

+0

"dataArray" ın aynı sırada olacağından emin misiniz? Şüphesiz, isteklerin gönderildiği sırayla, sunucunun istekleri yanıtlandığı sırayla olacaktır. –

+0

"promiseArray" öğesi doğru sırada hemen oluşturulur. Bireysel sözler farklı bir düzen içinde doldurulmuş olsa bile, "promiseArray" içindeki konumları aynı kalır. $ q.all' tüm bireysel vaatlerin yerine getirilmesini bekler. "DataArray", "promiseArray" ile aynı sırada çözülür. – georgeawg

0

Groben'in belirttiği gibi, her istek için bir dizi vaat oluşturabilir ve ardından "tamamlandığında" geri çağırma işlemini tamamlandığında kullanabilirsiniz. Tüm verileri doğru sırayla almak için $q.all kullanın.

+0

bittikten sonra geri arama çağrılabilir mi, benim özel durumumda tercih edilen bir örnekte bunu yazabilir misiniz? Gerçekten yardımcı olur. –

+0

Yukarıdaki @georgeawg cevabı tam olarak önerdiğim şey. Muhtemelen daha doğru olan "ne zaman", "o zaman" kullanır, yerine –

0

$ http.get ('/ someUrl', config) .then (successCallback, errorCallback); $ http.post ('/ someUrl', veri, yapılandırma) .then (successCallback, errorCallback);

+0

Lütfen cevabınızı biçimlendirin. –