[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という配列に格納し直している