Выполнить операцию с результатом агрегирования функции

Признаюсь, я не очень хорошо лажу с отложенным объектом. Я делаю запрос к базе данных в нескольких "магазинах", и в результате я хочу выполнить ряд операций. Это беспокоит меня, потому что результаты возвращаются асинхронно, и у меня нет возможности выполнить соответствующую операцию с "хранилищем", которое вы должны. Короче говоря, проблема в том, что этот кусок кода всегда выполняет одну и ту же функцию в одном и том же "Магазине"

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

Обратите внимание, что ключи (первичные или индексные) всегда сортируются в порядке возрастания. Макс ключ является первым ключом в обратном порядке.

Другие вопросы по тегам