在YDN-DB事务中嵌套延迟

Nested deferred in a YDN-DB transaction

本文关键字:嵌套 延迟 事务 YDN-DB      更新时间:2023-09-26

我看过这里张贴的例子:YDN-DB与多个延迟,其中包含一些代码非常接近我想要的,但不完全。

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

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服务

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

只要你的承诺是同步或使用db承诺(总是异步)解决的,那么嵌套延迟是安全的。

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

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