【问题标题】:YDN-DB with multiple deferred具有多个延迟的 YDN-DB
【发布时间】:2013-09-30 06:21:31
【问题描述】:

我试图通过 jquery $.when 使用多个延迟但到目前为止没有运气,这是我的代码:

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

我的示例不起作用,所以希望你们能帮助我,我到处寻找解决方案。谢谢

【问题讨论】:

    标签: javascript jquery deferred ydn-db


    【解决方案1】:

    我明白了。我将看到如何实现 jquery 延迟列表。虽然 ydn-db promise 有 donefailthem 等,但它不是 $.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;
    });
    

    这有点乱,但效率更高,因为所有三个查询都在一个事务中运行。

    编辑:

    只需要添加promise() method,它返回一个具有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 中的complete code

    编辑:

    从 0.8.1 版本开始,promise 方法被添加到请求对象中,不再需要包装。 Example.

    【讨论】:

    • 我应该把$.when放在一个变量中,然后像var req = $.when(***);一样正常使用它,然后像req.done(function(count,r,config){****})一样使用它吗?再次感谢您的帮助
    • 没有。我们无法解决运行请求承诺。其结果未定义。
    • 我还不能测试第一个解决方案,但是我回家后会做,另一个问题,如果我在表中有这些记录 db.add('person',{id:1,name:"Frank",age:23}); 然后想更新一个记录db.put('person',{id:1,age:20}); 记录name:"Frank" 从表person 中删除。如何更新单个字段而不影响其他字段?谢谢
    • 您能单独提问吗?
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多