Deferredその5:when()を使用して、複数の非同期処理を並列処理
when()を使用して、複数の非同期処理を並列処理
Deferredによる.when()を使う事により並列処理が可能です。
when()を使用して、複数の非同期処理を並列処理の書式
$.when(
Deferredその1,
Deferredその2,
Deferredその3,
[以下続く…]
)
.コールバック(
function(
受取り値その1,
受取り値その2,
受取り値その3,
[以下続く…]
){
処理;
});
特に.ajax()等の場合は時間が掛かるので、複数処理の場合はタイムラグよるズレが生じる場合があります。
この様な時に、when()を使用して、複数の非同期処理を並列処理をすると非常に便利です。
when()を使用して、複数の非同期処理を並列処理のサンプル
例によってjQueryのサンプルコードを書きましたので、それを見ながら並列処理の流れを見ていきましょう。
リクエストのパラメーターの値の分、スリープするテスト用のPHP
1.受け取るパラメータには"sleep_sec"があり、この値の分、sleep関数にてスリープします。
2.極端に大きい値を受け取ると、ずっとスリープ処理をし続けてしまうので、バリデートを掛けてます。
3.スリープ後にメッセージを出力します。
test-deferred-when.php
// ※これはhtmlではなくphpファイルです、<?phpと?>で囲んでください
// ※またこのコードをテストする場合は&の部分を半角にしてください
$sleep_sec = $_SERVER["REQUEST_METHOD"] == "GET" ? $_GET["sleep_sec"] : $_POST["sleep_sec"] ;
if($sleep_sec >= 0 && $sleep_sec <= 60){
sleep($sleep_sec);
echo "リクエスト先のphpでsleep()を" . $sleep_sec . "秒しました。";
}else{
header("HTTP/1.1 400 Bad Request");
}
when()による並列処理のjQueryサンプルコード
1.getAjaxPromise()はリクエスト先phpに渡すパラメータ(スリープ秒)の引数がある
2..ajax()によりリクエストされたphpはパラメーターの値の分、スリープしてメッセージを出力する。
3.スリープ秒をばらばらにして5回ほどgetAjaxPromise()を実行する。
4.5個のDeferred処理について、when()による並列処理をする。
5.5個のDeferred処理で一番時間の掛かるのが10秒のスリープなので、10秒後に5個分の結果の出力がliタグに一斉に追加される
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<style type="text/css">
<!--
div {border: 1px solid black;}
-->
</style>
<script src="../../js/jquery-1.12.2.min.js"></script>
<script>
$(function(){
function getAjaxPromise(sleep_sec){
// Deferredオブジェクト作成
var defer = new $.Deferred;
$.ajax({
url: "test-deferred-when.php",
data: "sleep_sec=" + sleep_sec,
success: function(data) {
// Deferredの状態をresolveとする。
// これによりコールバック関数は.done()となる。
defer.resolve(data);
},
error: function(jqXHR, textStatus, errorThrown) {
// Deferredの状態をrejectとする。
// これによりコールバック関数は.fail()となる。
defer.reject(jqXHR, textStatus, errorThrown);
}
});
return defer.promise();
}
$.when(
getAjaxPromise(5),
getAjaxPromise(10),
getAjaxPromise(3),
getAjaxPromise(4),
getAjaxPromise(8))
.done(function(data_1, data_2, data_3, data_4, data_5){
$("ul").append("<li>" + data_1 + "</li>");
$("ul").append("<li>" + data_2 + "</li>");
$("ul").append("<li>" + data_3 + "</li>");
$("ul").append("<li>" + data_4 + "</li>");
$("ul").append("<li>" + data_5 + "</li>");
});
});
</script>
</head>
<body>
<ul>
</ul>
</body>
</html>

