0

正直に言うと、私は Deferred オブジェクトとうまくやっていけません。いくつかの「ストア」でデータベースにクエリを実行しているため、一連の操作を実行したいと考えています。結果が非同期に返され、必要な「ストア」で対応する操作を実行する方法がないため、これは私を悩ませます。つまり、問題は、このコードが常に同じ「ストア」で同じ関数を実行することです。

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 に答える