2013-08-25 28 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); 
    } 
); 
} 

注意,键(主或索引)总是被按升序排序。最大密钥是相反顺序的第一个密钥。