1

jquery $.when で複数の deferred を使用しようとしていますが、これまでのところうまくいきません。これが私のコードです:

var req = $.when(db.count('items'),db.values('items'),db.get('config', 1));

req.done(function(count,r,config) {
  var currency = config.currency;
  if(count > 0){
    var n = r.length;
    for (var i = 0; i < n; i++) {                   
      var id    = r[i].id;
      var itemId = r[i].itemId;
      console.log('ID: '+id+' itemID: '+itemId+' Currency: '+currency);
    }
  }
});

私のサンプルが機能していないので、皆さんが私を助けてくれることを願っています。解決策をどこでも探しました。ありがとう

4

1 に答える 1

0

分かりました。jquery 遅延リストを実装する方法を見ていきます。ydn-db promise にはdonefail、などがありますが、インスタンスthemではありません。$.Deferredアダプターのアプローチが必要です。

現在、次のようにトランザクションを使用します。

var results = {};
var tx_req = db.run(function(tx_db) {
  tx_db.count('items').done(function(x) {
    results.count = x;
  });
  tx_db.values('items').done(function(x) {
    results.values = x;
  });
  tx_db.get('config', 1).done(function(x) {
    results.config = x;
  });
}, ['items', 'config'], 'readonly');

req.done(function() {
  var count = results.count;
  var r = results.values;
  var config = results.config;
  var currency = config.currency;
  if(count > 0){
    var n = r.length;
    for (var i = 0; i < n; i++) {                   
      var id    = r[i].id;
      var itemId = r[i].itemId;
      console.log('ID: '+id+' itemID: '+itemId+' Currency: '+currency);
    }
  }
  results = null;
});

少し面倒ですが、3 つのクエリすべてが 1 つのトランザクションで実行されるため、より効率的です。

編集:

、および関数を持つオブジェクトを返すpromise()メソッドを追加するだけです。多くのオーバーヘッドなしで実行できるはずです。基本的に、次のようなアダプターを実行できます。donefailprogress

var wrap = function(req) {
  req.promise = function() {
    return req; // Note: req has done, fail and progress functions.
    // however, jquery api demand promise to return a new deferred. 
  }
  return req;
}
$.when(wrap(db.count('items')),wrap(db.values('items')),wrap(db.get('config', 1)));

jsfiddleの完全なコードを次に示します。

編集:

リリース 0.8.1 から、リクエスト オブジェクトに promise メソッドが追加され、ラッピングが不要になりました。

于 2013-10-01T04:21:53.260 に答える