2013-08-25 67 views
0

我承認我與Deferred對象相處得不好。我正在查詢幾個「商店」上的數據庫,結果我想要做一系列的操作。這給我帶來了麻煩,因爲結果是異步返回的,我無法在「應用商店」上執行相應的操作。總之,問題是,這一段代碼總是執行上相同的「商店」使用集合函數結果進行操作

for (var i = 0; i < schema['stores'].length; i++) { 
     storeName = schema['stores'][i].name; 

     var objeto = db.executeSql('SELECT MAX(date_upd) FROM ' + '"' + storeName + '"').done(
       function(result, a){ 
        //saveDataSynce(db, storeName, result); 
        console.log(result); 
       } 
     ); 
} 

回答

1

只要存在對異步操作的循環同樣的功能,必須非常小心的功能範圍。在您的示例代碼中,函數內部的storeName將始終是最後執行的值。使用功能範圍如下:

var getMax = function(storeName) { 
    db.executeSql('SELECT MAX(date_upd) FROM ' + '"' + storeName + '"').done(
    function(result){ 
     //saveDataSynce(db, storeName, result); 
     console.log(storeName, result); 
    } 
); 
} 

for (var i = 0; i < schema['stores'].length; i++) { 
    getMax(schema['stores'][i].name); 
} 

然而,對於YDN-DB優選編碼圖案是NoSQL的樣式如下:

var getMax = function(storeName) { 
    var indexName = 'date_upd'; 
    var key_range = null; // whole store 
    var limit = 1; 
    var offset = 0; 
    var reverse = true; 
    db.values(storeName, indexName, key_range, limit, offset, reverse).done(
    function(results) { 
     var max_key = results[0]; // may be undefined. OK. 
     //saveDataSynce(db, storeName, max_key); 
     console.log(storeName, max_key); 
    } 
); 
} 

注意,鍵(主或索引)總是被按升序排序。最大密鑰是相反順序的第一個密鑰。