嵌套在YDN-DB事务中延迟

时间:2014-05-15 16:34:39

标签: javascript deferred ydn-db

我看过这里发布的示例: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服务的异步调用之前的代码

1 个答案:

答案 0 :(得分:1)

是的,你正确使用它。正如@Bergi所说,您只需返回run请求即可。

只要你的promises被同步解析或使用db promises(总是异步),就可以安全地延迟嵌套。

延迟嵌套通常很好,需要担心循环,例如orders.forEach意外的大循环。浏览器对长事务不满意(是的,可能导致神秘错误或崩溃)。

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