Выполнить операцию с результатом агрегирования функции
Признаюсь, я не очень хорошо лажу с отложенным объектом. Я делаю запрос к базе данных в нескольких "магазинах", и в результате я хочу выполнить ряд операций. Это беспокоит меня, потому что результаты возвращаются асинхронно, и у меня нет возможности выполнить соответствующую операцию с "хранилищем", которое вы должны. Короче говоря, проблема в том, что этот кусок кода всегда выполняет одну и ту же функцию в одном и том же "Магазине"
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);
}
);
}
Обратите внимание, что ключи (первичные или индексные) всегда сортируются в порядке возрастания. Макс ключ является первым ключом в обратном порядке.