2012-10-24 63 views
2

我想要的是以異步模式運行代碼以獲得更快的響應(多線程)。asyn foreach在jQuery

我有一個數組像「源」與飼料,我想要的是從每一個獲取數據。

我想是這樣的:

$.each(sources, function(key, val) { 
    JSON CALL OF EACH SOURCE 
} 

,然後組所有的結果在一個數組,並告訴他們。問題是我想要在異步模式下的json調用,因爲它們中的一些需要一些時間。

我怎麼能在jQuery異步模式下做'每個'?

+0

參閱此http://www.bennadel。 com/blog/2326-jQuery-whenSync-Plugin-For-Chaining-Asynchronous-Callbacks-Using-Deferred-Objects.htm –

回答

3

使用延遲對象:

// get an array of jqXHR objects - the AJAX calls will 
// run in parallel, subject to browser limits on the number 
// of concurrent connections to each host 
var defs = $.map(sources, function() { 
    return $.ajax({ url: this }); 
}); 

// when they're all done, invoke this callback 
$.when.apply($, defs).done(function() { 
    // "arguments" array will contain the result of each AJAX call   
    ... 
}); 

要改變AJAX功能,這樣只返回data的說法,你可以用.pipe()

var defs = $.map(sources, function() { 
    return $.ajax({ url: this }).pipe(function(data, text, jqxhr) { 
     return data; // filtered result 
    }); 
}); 
+0

這樣做: $ .when.apply($,defs).done(function(data) console.log(數據); 我得到的是這樣的: [ 陣列[88] ,「成功」, 對象 ] 的數據是數組[88]中,但我怎麼能訪問它?對不起,但林掙扎着這一點,答案必須很容易 – themazz

+0

@themazz你會得到一個這樣的條目爲每個AJAX調用 - 使用'參數'僞陣列(每個代碼)來訪問它們。啊,我知道,每個元素也包含AJAX'textStatus'和'jqXHR'結果。因此,要訪問第n組數據,請使用'arguments [n] [0]' – Alnitak

+0

@themazz有一種方法可以簡化此操作 - 我將編輯答案 – Alnitak