2012-07-01 113 views
1

我想寫一個程序,在2個對象因ajax函數的回調而返回後執行某些操作。jquery從ajax調用的回調推遲

我知道使用jQuery的經典例子,當():

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

但在我的情況,我不想觸發時的AJAX功能的執行,我想的時候從執行ajax函數的回調中觸發。例如:

$.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 
}); 

但當然,這是行不通的。想法?

回答

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 
}); 

如果你不想來處理請求一起,你可以創建自己的deferreds並使用這些:

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 
}); 
+0

是的,你發佈的作品。但問題在於,當$ .get函數返回時啓動了when,但如果您注意到上述情況,我會爲每個$ .get請求發生回調,並且何時不會等待這些回調進行處理,只是當$ .get函數完成時。所以,何時發射太早。 –

+0

@RyanOgle如果你不能因爲某種原因一起處理這些響應,你可以創建你自己的延遲並使用它們。通過示例更新答案。 – Trevor

+0

@ Trevor我必須在這裏失去一些東西。在你添加的例子中,when()不應該觸發,直到2延遲得到解決?我沒有得到這個工作。看看這個簡單的例子:http://jsfiddle.net/ax4u4/當()被觸發時,即使延遲對象永遠不會被解析。 –

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陣列, 在最後它將被迭代並在成功後加載,它會初始化爲 loadTester

loadTester將檢查您的thingsToLoad陣列的長度,當加載的文件與文件長度匹配且dom處於就緒狀態時,它將爲launch()

如果你只是加載HTML文件或文本文件,可以把它們(data在AJAX功能)爲loadTester和積聚在那裏(就像那些loadCounterloadEnds私人變種內),並通過積累數組或對象到launch()