2013-10-04 25 views
0

我有以下的javascript程序:的JavaScript等幾個回調結束

   function jQueryFunction(url, callback) 
       { 
        $.ajax 
          ({ 
           type: "GET", 
           async: true, 
           url: url, 
           dataType: "jsonp", 
           jsonp: "callback", 
           jsonpCallback: "tpsHandler", 
           success: function(json) 
           { 
            return callback(json); 
           } 
          }); 
       } 

       var jsonArray = new Array(); 
       for(var i = 0; i < 10; i++) 
       { 
        jQueryFunction(url[i], function(json){ 
         jsonArray[i] = json; 
        }); 
       } 

       //process jsonArray 

然而,當我在for循環檢查jsonArray,它是空的。所以我的問題是,如何將返回值從jQueryFunction存儲到for循環中的jsonArray然後處理它?我試過$ .when.apply($,jsonArray).done(函數),但仍然是相同的,它是空的。

+0

你傳遞一個號碼作爲網址,這或許可以解釋爲什麼它的空白? –

+0

這是一個錯字,修復它 – user2597504

+0

您是否檢查過Chrome開發人員工具的回報? –

回答

1

一個簡單的方法:

function doTheAjax(url, callback) { 
    return $.ajax({ 
    type: "GET", 
    async: true, 
    url: url, 
    dataType: "jsonp", 
    jsonp: "callback", 
    jsonpCallback: "tpsHandler" 
    }); 
}; 

var reqs = []; 

for(var i = 0; i < 10; i++) { 
    reqs.push(doTheAjax(url[i])); 
} 

// send the array of requests to when, which will fire `done` 
// when it's, well, done 
$.when.apply($.when, reqs).done(function() { 
    $.each(arguments, function(data) { 
    // process the data 
    }); 
}); 

或者,讓一堆的請求,並把它們納入jsonArray,但保持 跟蹤你正在做多少。當他們全部完成時,你有陣列。創建您的 自己的推遲,計數器啓動時自己解決它,並返回承諾。

var getJSON = function(url) { 
    var dfd = $.Deferred(); 
    var count = 0; 
    var total = 10; 

    var jsonArray = []; 

    for(var i = 0; i < total; i++) { 
    doTheAjax(url[i]).done(function(json) { 
     jsonArray.push(json); 
     count++; 
     if (count >= total) { 
     dfd.resolve(jsonArray); 
     } 
    }); 
    } 
    return dfd.promise(); 
}; 

getJSON().done(function(theCreatedJsonArray) { 
    // do stuff 
}); 
0

我不知道爲什麼your previous question(使用deferreds)的答案無效。但是問題的原因是你在任何ajax響應到達之前檢查數組。您在i引用所有回調中的相同值時也有問題。

一個簡單的解決方法,如果你知道你有多少迴應期待:

var arr = []; 
for(var i = 0; i < 10; i++){ 
    jQueryFunction(url[i], function(json){ 
     arr.push(json); 
     if(arr.length == 10) { 
      // All 10 responses arrived! 
      // DO STUFF FROM HERE 
      // e.g., call another function 
      console.log(arr); 
     } 
    }); 
} 
+0

我不認爲它會工作。如果我在for循環之後檢查arr,它必須爲空 – user2597504

+0

循環後不應檢查它,請參閱代碼中的註釋。 – bfavaretto