簡體   English   中英

遞延承諾和jQuery

[英]Deferred Promise & Jquery

我閱讀了很多有關延期的答案,但找不到確切的答案。

接近的代碼是http://jsfiddle.net/UZzeC/

我的代碼不同之處在於,我想在when內調用“ process”函數。 陳述N次。

//Dynamically generated JSON list
var json_list = [
    {"id":"div1","name":"Google.com"},
    {"id":"div2","name":"eBay.com"}
    {"id":"div3","name":"Yahoo.com"},
    {"id":"div4","name":"Facebook.com"}
];

$.when(
    for (var i in json_list) {
        process(json_list[i].id, json_list[i].name),
    }
).done(function() {
    $('#global').text("OK"); }
) .fail(function() {
    $('#global').text("FAIL");
});

最終狀態將是代碼,該代碼將異步連接到多個Web服務並在每個數據返回時返回其進度

我可以像這樣嵌入這個循環嗎? 我在“應用”上看到了一些用法,何時使用,但不確定如何使用。

我認為您想要做的是這樣的……(假設過程返回一個$ .Deferred()。promise()對象)

var requests = [];

for (var i=0; i<json_list.length; i++) {
    requests.push(process(json_list[i].id, json_list[i].name));
}

$.when.apply($, requests).then(
    function() { $('#global').text("OK"); },
    function() { $('#global').text("FAIL"); }
);

編輯:編輯代碼以正確地迭代數組。 我以為它是一個對象,用於..in,但是您應該始終使用這種方式;)

只有在非常特殊的情況下(實際上, 從不 ),才能使用for(var i in arr) {...}遍歷數組。 原因是數組可能具有其數字數組索引以外的其他屬性,即使if(arr.hasOwnProperty(i))不會被濾除。

例如 :

var arr = ['A', 'B', 'C'];
arr.color = 'RED';

現在,通過循環arrfor(var i in arr)你會發現ABC ,和RED 即數組的成員及其屬性

DEMO

為了確保僅尋址數組成員,請使用for(var i=0; i<arr.length; i++) {...}循環。

DEMO

因此,您可以執行以下操作:

var requests = [];
for(var i=0; i<json_list.length; i++) {
    requests.push(process(json_list[i].id, json_list[i].name));
}

$.when.apply(null, requests).then(function() {
    $('#global').text("OK");
}, function() {
    $('#global').text("FAIL");
});

您還可以使用本機Array.prototype.map()jQuery.map()遍歷原始數組並返回經過處理的數組。 為了緊湊$.when ,可以將處理后的數組匿名傳遞給$.when ,如下所示:

$.when.apply(null, $.map(json_list, function(request) {
    return process(request.id, request.name);
}).get()).then(function() {
    $('#global').text("OK");
}, function() {
    $('#global').text("FAIL");
});
  1. 不要在數組中使用for .. in
  2. 您不能用for循環代替函數參數-JS不能那樣工作

由於您的json_list是一個數組,因此您只需使用.map即可獲得一個新的Promises數組,一個用於原始數組中的每個條目:

var requests = json_list.map(function(l) {
    return func_returning_promise(l.id, l.name);
});

然后可以使用Function.prototype.apply將此Promises數組傳遞給$.when ,就好像它們是單個參數一樣:

$.when.apply($, requests).then(okFunc, failFunc);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM