使用聚合函数结果进行操作

时间:2013-08-25 16:13:05

标签: ydn-db

我承认我与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);
                }
        );
}

1 个答案:

答案 0 :(得分: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);
    }
  );
}

请注意,键(主键或索引)始终按升序排序。 Max键是相反顺序的第一个键。