【问题标题】:Nested deferred in a YDN-DB transaction嵌套在 YDN-DB 事务中的延迟
【发布时间】:2014-07-04 05:47:03
【问题描述】:

我查看了此处发布的示例:YDN-DB with multiple deferred,其中包含一些非常接近我想要的代码,但并不完全。

我想知道在事务中嵌套延迟查询是否安全?例如:

loadWorkOrders: function() {

        var params = {
            userId: 1,
            status: Status.Allocated
        };

        var allOrders = null;

        return workOrderHttpService.getWorkOrders(params).then(function(orders) {
            allOrders = orders.data;
            return ydndatabase.open();
        }).then(function(db){
                return db.run(function(runDb){
                    allOrders.forEach(function(workOrder){
                        runDb.count(Store.WorkOrder, ydn.db.KeyRange.only(workOrder.id)).then(function(count) {
                            if(count == 0) {
                                return runDb.put(Store.WorkOrder, workOrder);
                            } else {
                                return workOrder;
                            }
                        });
                    });
                }, [Store.WorkOrder], TransactionType.ReadWrite)
            });

    }

编辑:我已经编辑了代码以显示它之前是如何对 http 服务进行异步调用的

【问题讨论】:

  • Don't create a deferred 告诉你你的req 承诺何时解决,你已经有一个承诺!!!
  • 啊,好点,是的,谢谢。 (这仍然是非常快速地破解在一起的原型代码)但是,问题仍然存在。

标签: javascript deferred ydn-db


【解决方案1】:

是的,你用对了。正如@Bergi 所说,您可以返回run 请求。

只要你的 promise 是同步解决的或者使用 db promises(总是异步的),嵌套 deferred 是安全的。

嵌套延迟一般没问题,循环是要担心的,例如orders.forEach 用于意外的大循环。浏览器对长事务不满意(是的,可能会导致神秘错误或崩溃)。

就像使用 count 来检查记录存在的方式一样。我认为应该是ydn.db.KeyRange.only(workOrder.id),因为count 需要一个键范围输入参数。

【讨论】:

  • 非常感谢.....但是回复:返回运行请求我不能,因为我实际上简化了代码以便将其发布在这里。在实际代码中,返回原始订单列表的服务返回一个承诺,因此上面的代码被包装在另一个 then() 中。
  • 这是 OT 但刚刚意识到我可能需要链接承诺而不是嵌套承诺。
  • 没有。循环会运行得更快。
  • 对不起...实际上上面的代码不起作用。执行 ydn.db.KeyRange.only(workOrder.id) 有效,但随后每个 runDb.put 都会给出以下错误:“Uncaught TransactionInactiveError: Failed to execute 'put' on 'IDBObjectStore': The transaction is not active。”跨度>
  • 我已经编辑了代码以显示它是如何在异步调用 http 服务之前进行的。这应该有什么不同吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多