RxJS将数组映射到可观察对象,并返回到数组中的普通对象
我有一个对象数组,需要从中分别将每个对象传递到异步方法中(后面的过程用Promise处理,然后通过RxJS将数组映射到可观察对象,并返回到数组中的普通对象,rxjs,observable,rxjs5,angular2-observables,fork-join,Rxjs,Observable,Rxjs5,Angular2 Observables,Fork Join,我有一个对象数组,需要从中分别将每个对象传递到异步方法中(后面的过程用Promise处理,然后通过Observable.fromPromise(…)转换回Observable)-需要这种方法,因为在任何时候只传递单个对象的情况下都会使用相同的方法;过程是将对象保存到数据库中)。例如,这是一个对象数组: [ { "name": "John", ... }, { "name": "Anna", ... }, { "name": "Joe",
Observable.fromPromise(…)转换回Observable)
-需要这种方法,因为在任何时候只传递单个对象的情况下都会使用相同的方法;过程是将对象保存到数据库中)。例如,这是一个对象数组:
[
{
"name": "John",
...
},
{
"name": "Anna",
...
},
{
"name": "Joe",,
...
},
{
"name": "Alexandra",
...
},
...
]
现在我有了一个名为insert的方法,它将对象插入数据库。数据库实例中的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;
}
);
}
如果有任何指向正确方向的建议,我将非常高兴。提前谢谢 要从数组转换为可观测值,您可以使用
要从可观测转换为阵列,请使用。请注意,这确实会返回数组的可观察值,因此您仍然需要.subscribe(arr=>…)
将其取出
也就是说,您的代码看起来确实正确。但是,如果您确实想从
中尝试,请按如下方式编写代码:
insertAll(users: User[]): Observable<User[]> {
return Observable.from(users)
.mergeMap(user => this.insert(user))
.toArray();
}
正如@cartant提到的,问题可能不在Rx中,可能是您的数据库不支持多个连接。在这种情况下,您可以将替换为使Rx仅发送1个并发请求:
insertAll(users: User[]): Observable<User[]> {
return Observable.from(users)
.concatMap(user => this.insert(user))
.toArray(); // still optional
}
insertAll(用户:User[]):可观察{
可观察的返回。来自(用户)
.concatMap(用户=>this.insert(用户))
.toArray();//仍然是可选的
}
看不到任何明显的错误。听起来只有第一个承诺在解决。您确定数据库支持多个并发承诺吗?如果你只是用承诺和承诺来尝试,会发生什么?(另外,在您的第一个代码片段中,您创建了一个storedUser
,但返回了user
,而不是storedUser
)感谢您的建议,幸运的是,并发承诺没有问题。这个例子中有一个输入错误,我现在已经纠正了。谢谢!当我将forkJoin
从更改为,并将mergeMap
+toArray
更改为时,事情开始按预期工作。
insertAll(users: User[]): Observable<User[]> {
return Observable.from(users)
.mergeMap(user => this.insert(user))
.toArray();
}
insertAll(users: User[]): Observable<User> {
return Observable.from(users)
.mergeMap(user => this.insert(user));
}
insertAll(users: User[]): Observable<User[]> {
return Observable.from(users)
.concatMap(user => this.insert(user))
.toArray(); // still optional
}