2013-12-19 139 views
27

這應該是一個簡單的。 我有一個被調用的函數,我需要等待所有的異步操作完成。 我想是這樣的......jQuery推遲。每個循環

self.processSchema(data).done(function(results){ //do stuff}); 

的processSchema功能循環使用$。每個並調用異步方法。

var processSchema = function(data) 
{ 
    var def = new $.Deferred(); 
    $.each(table, function() 
    { 
     //calls an async SQLitePlugin method 
     db.executeSql(sql, data, function(tx, results){ 
      def.resolve(results); 
     } 
    } 

    return(def.promise()); 
} 

這似乎並不工作,我是新來.Deferred $因此任何指導,將是有益的

+0

'$ .deferred.apply' –

+0

我想你會需要一個(deferred1,deferred2 ... defferedN).then(函數(data1,data2 ... dataN){});然後執行每個db.executeSql的延遲。 –

回答

33

你需要爲每個迭代

var processSchema = function(data) { 
    var promises = []; 

    $.each(table, function() { 
     var def = new $.Deferred(); 
     db.executeSql(sql, data, function(tx, results){ 
      def.resolve(results); 
     }); 
     promises.push(def); 
    }); 

    return $.when.apply(undefined, promises).promise(); 
} 
+0

adeneo,應該返回defcon.promise()? – gdex

+0

@gdex爲什麼不呢? –

+1

是的,它應該!可以返回承諾數組,但要保持OP想要調用該函數的語法,我認爲一個主承諾返回,然後在解決所有其他承諾時解決將更容易,然後將所有直接返回數據作爲參數數組? – adeneo

7

一個承諾函數式編程惡魔(像我一樣),這是一個單表達版本adeneo's answer

var processSchema = function(data) { 
    return $.when.apply($, $.map(table, function() { 
     var def = new $.Deferred(); 
     db.executeSql(sql, data, function(tx, results){ 
      def.resolve(results); 
     }); 
     return def; 
    })).promise(); 
}; 

另外我想指出的是,你正在遍歷table,但是對迭代中的每個項目都沒有做任何事情(即)回覆沒有任何爭論。)現在,我不確定你的目標是什麼,但這看起來並不合適:P

+0

我發佈的功能還有很多,爲簡潔起見我沒有包含一些非必要的東西...... – gdex