[jquery]並列処理の結果を順番通りに受け取る方法

通常jqueryを使用してAPIサーバに複数のリクエストを並列で処理させた場合、レスポンスが帰ってきた順番に次のsuccess処理が実行されてしまい、順番がランダムになってしまう。

とはいえ、並列ではなく番号順に処理させると処理速度が落ちてしまう。

$.ajaxの並列処理の結果を順番通りに受け取る方法は以下のように$.ajax自体を配列で格納して$.whenを使用して受け取ると順番通りに値が並ぶ

var productid = [1,2,3,4];
var jqXHRList = []; 
for (var i = 0; i < productid.length; i++) {
 jqXHRList.push($.ajax({
 // $.ajaxの戻り値を配列に格納
 url: 'api/hogehoge.php',
 data: {productid: productid[i]},
 dataType: 'json'
 })); 
}

$.when.apply($, jqXHRList).done(function () {
 var json = [];
 var statuses = [];
 var jqXHRResultList = [];
 for (var i = 0; i < arguments.length; i++) {
  var result = arguments[i];
  json.push(result[0]);
  statuses.push(result[1]);
  jqXHRResultList.push(result[3]);
  var dataStr = result.phrase;
  if(dataStr!= null){
   $(`#product${i}`).val( dataStr );
  }
 }
});

上記コードはproductid配列1,2,3,4をそれぞれforで回してAPIにproductidを変数としてPOSTし並列処理させている。さらにAPIのjson結果を1,2,3,4と順番通りに受け取って処理している。

$.whenで処理する時、argumentsという変数に結果が格納されている。APIから受け取った結果はargumentsのそれぞれ[0]に格納されているのでjsonという配列に格納し直している

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です