我承认我与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);
}
);
}
答案 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键是相反顺序的第一个键。