gpt4 book ai didi

RxJS 将数组映射到可观察对象并返回到数组中的普通对象

转载 作者:行者123 更新时间:2023-12-03 01:18:05 26 4
gpt4 key购买 nike

我有一个对象数组,我需要将每个对象分别传递到异步方法中(后面的过程使用 Promise 处理,然后通过 Observable.fromPromise(...) 转换回 Observable - 这种方式是需要的,因为在任何时候都只传递单个对象的情况;该过程正在将对象保存到数据库中)。例如,这是一个对象数组:

[
{
"name": "John",
...
},
{
"name": "Anna",
...
},
{
"name": "Joe",,
...
},
{
"name": "Alexandra",
...
},
...
]

现在我有一个名为 insert which 的方法它将对象插入数据库。 store数据库实例中的方法返回新创建的 id。最后,复制初始对象并使用其新 id 进行映射:

insert(user: User): Observable<User> {
return Observable.fromPromise(this.database.store(user)).map(
id => {
let storedUser = Object.assign({}, user);
storedUser.id = id;
return storedUser;
}
);
}

如果我插入单个对象,这很有效。但是,我想添加对插入多个对象的支持,这些对象只需调用单个插入的方法。目前这是我所拥有的,但它不起作用:

insertAll(users: User[]): Observable<User[]> {
return Observable.forkJoin(
users.map(user => this.insert(user))
);
}

insertAll方法正在按预期插入用户(或用其他用户填充数据库),但我没有得到任何响应。我正在调试正在发生的事情,似乎 forkJoin仅从第一个映射用户获得响应,但其他用户将被忽略。订阅insertAll不执行任何操作,通过 catch on insertAll 也没有任何错误或通过订阅 insertAll 中的第二个参数.

因此,我正在寻找一种解决方案,其中 Observable(在 insertAll 中)将以该形式发回用户的新对象数组:

[
{
"id": 1,
"name": "John",
...
},
{
"id": 2,
"name": "Anna",
...
},
{
"id": 3,
"name": "Joe",,
...
},
{
"id": 4,
"name": "Alexandra",
...
},
...
]

如果有任何指向正确方向的建议,我将非常高兴。提前致谢!

最佳答案

要将数组转换为可观察的,您可以使用 Rx.Observable.from(array) .

要将可观察值转换为数组,请使用 obs.toArray() 。请注意,这确实返回了一个数组的 observable,因此您仍然需要 .subscribe(arr => ...) 来获取它。

也就是说,您的代码带有 forkJoin 看起来是正确的。但如果您确实想尝试 from,请编写如下代码:

insertAll(users: User[]): Observable<User[]> {
return Observable.from(users)
.mergeMap(user => this.insert(user))
.toArray();
}

另一种更像 rx 的方法是在值完成时发出值,而不是像 forkJointoArray 那样等待所有值。做。我们可以省略 toArray从前面的例子中我们得到了它:

insertAll(users: User[]): Observable<User> {
return Observable.from(users)
.mergeMap(user => this.insert(user));
}

正如 @cartant 提到的,问题可能不在 Rx 中,可能是您的数据库不支持多个连接。在这种情况下,您可以替换 mergeMapconcatMap让 Rx 仅发送 1 个并发请求:

insertAll(users: User[]): Observable<User[]> {
return Observable.from(users)
.concatMap(user => this.insert(user))
.toArray(); // still optional
}

关于RxJS 将数组映射到可观察对象并返回到数组中的普通对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45774847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com