我看过这里发布的示例: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服务的异步调用之前的代码
答案 0 :(得分:1)
是的,你正确使用它。正如@Bergi所说,您只需返回run
请求即可。
只要你的promises被同步解析或使用db promises(总是异步),就可以安全地延迟嵌套。
延迟嵌套通常很好,需要担心循环,例如orders.forEach
意外的大循环。浏览器对长事务不满意(是的,可能导致神秘错误或崩溃)。
就像使用计数来检查记录存在的方式一样。我认为它应该是ydn.db.KeyRange.only(workOrder.id)
,因为count
需要一个键范围输入参数。