jQuery無双

jQueryをとことん使いこなす! jQuery1.12対応。使い方、入門、サンプル、ノウハウをとことん極めた最強ブログ。

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>
 
when()による並列処理のjQueryサンプルの結果

9秒後まで
jquery,deferred,when,サンプル,非同期通信
そして10秒後
jquery,deferred,when,サンプル,非同期通信

 - 非同期通信(ajax) , , , ,