1

ajax関数のコールバックの結果として2つのオブジェクトが返された後に何かを実行するプロシージャを作成しようとしています。

私はJquerywhen()を使用する典型的な例を知っています:

$.when($.get("http://localhost:3000/url1"), 
$.get("http://localhost:3000/url2").done(//do something));

しかし、私の場合、ajax関数の実行時にwhenをトリガーするのではなく、ajax関数の実行からのコールバックからwhenをトリガーする必要があります。何かのようなもの:

$.get("http://localhost:3000/url1", function(data){
  function(){
    //do something with the data, and return myobj1;
  }
});

$.get("http://localhost:3000/url2", function(data){
  function(){
    //do something with the data, and return myobj2;
  }
});

$.when(obj1, obj2).done(function(){
  //do something with these 2 objects
});

しかしもちろん、それは機能しません。アイデア?

4

2 に答える 2

5

それは実際にうまくいくはずです。jQuery.when()複数の引数を取り、それらがすべて完了すると起動し、各結果引数を配列として返します。

var req1 = $.get("http://localhost:3000/url1");
var req2 = $.get("http://localhost:3000/url2");

$.when(req1, req2).done(function(res1, res2) {
    //do something with these 2 objects
});

リクエストをまとめて処理したくない場合は、独自の deferred を作成して使用できます。

var deferred1 = $.Deferred(),
    deferred2 = $.Deferred();

$.get("http://localhost:3000/url1", function(data){
    function(){
        //do something with the data, and return myobj1;
        deferred1.resolve(myobj1);
    }
});

$.get("http://localhost:3000/url2", function(data){
    function(){
        //do something with the data, and return myobj2;
        deferred2.resolve(myobj2);
    }
});

$.when(deferred1, deferred2).done(function(){
    //do something with these 2 objects
});
于 2012-07-01T04:35:11.827 に答える
0

または、自分でコントロールすることもできます

     $(function(){$('body').addClass('doc-ready')})
     var thingsToLoad = ['blabla.js','blublu.js','weee.js'];

     var launch = function(){

     // do whatever you want to do after loading is complete
     // this will be invoked after dom ready.
     // objectCollection will have everything you loaded.

     // and you can wrap your js files in functions, and execute whenever you want.

     }

     var loadTester = (function() {
        var loadCounter   = 0,
            loadEnds      = thingToLoad.length; // total number of items needs to be loaded
        return function() {
          loadCounter += 1;
          if (loadCounter === loadEnds) {
            if ($('body').hasClass('doc-ready')) {
              launch();
            } else {
              /* if body doesnt have ready class name, attach ready event and launch application */
              $(function() {
                launch();
              });
            }
          }
        }
      }());


$.each(thingsToLoad, function(i) {
    $.ajax({
      url      : thingsToLoad[i],
      mimeType : 'application/javascript',
      dataType : 'script',
      success  : function(data) {
        loadTester();
      }
    });
  });

thingsToLoadファイルを配列に 追加すると、最後に反復され、成功後にロードされ、 init になりますloadTester

loadTesterthingsToLoadロードされたファイルの数とファイルの長さが一致し、dom が準備完了状態の場合、配列の長さをチェックしますlaunch()

HTMLファイルまたはテキストファイルをロードするだけの場合は、それらを(dataajax関数で)渡してそこに蓄積し( andloadTesterのようなプライベートvar内に)、蓄積された配列またはオブジェクトをに渡すことができますloadCounterloadEndslaunch()

于 2012-07-01T07:07:58.813 に答える