0

我承认我与 Deferred 对象相处得不是很好。我正在对几个“商店”的数据库进行查询,因此我想做一系列操作。这让我很困扰,因为结果是异步返回的,我没有办法在你应该的“商店”上执行相应的操作。简而言之,问题是这段代码总是在同一个“Store”上执行同一个函数

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);
                }
        );
}
4

1 回答 1

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);
    }
  );
}

请注意,键(主键或索引)始终按升序排序。最大键是倒序的第一个键。

于 2013-08-26T06:25:09.627 回答