【发布时间】:2021-12-30 01:13:12
【问题描述】:
我问了一个问题
在完全错误的前提下。看来我的两个解决方案都与我的意图无关。
我创建了一个返回 Observable 的方法,并调用了两个返回 Promise 的方法。我尝试了两种方法:
public setItemInfos(itemInfos: IItemInfo[]): Observable<number> {
return from(this.db.selectionItemInfos.clear().then(() => {
return this.db.selectionItemInfos.bulkAdd(itemInfos);
}));
}
public setItemInfos(itemInfos: IItemInfo[]): Observable<number> {
const clear$ = from(this.db.selectionItemInfos.clear());
const bulkAdd$ = from(this.db.selectionItemInfos.bulkAdd(itemInfos));
return clear$.pipe(concatMap(() => bulkAdd$))
}
用途将是:
myService.setItemInfos(itemInfos).subsribe(count => {
console.log(`Cleared the table 1st and then added ${count} new items`);
});
我从两个版本中都认为:
- table clear 是在 bulkAdd 开始时执行完成
- bulkAdd 完成后,我从订阅中获取计数
这应该怎么做?或者可以做到吗?
【问题讨论】:
-
你有什么特定的理由想要将 Promise 包装到 observables 中吗?像这样的命令式操作通常使用异步函数(带有等待)更容易组合。我很好奇 Observables 在这种情况下给你带来了什么好处。另一方面,在查询数据(从 db 读取)时,Observables 非常适合观察只读查询,这就是 Dexie 3.2 使用其新的 liveQuery() 函数内置它们的原因。
-
不幸的是,我是 Promise 文盲,恕我直言,试图将所有这些 async/await 代码添加到纯粹在 Observables 上运行的应用程序并不容易。
-
@DavidFahlander:我会很感激一个例子,这是如何使用异步等待完成的。
标签: promise rxjs indexeddb dexie