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

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",

我有一个对象数组,需要从中分别将每个对象传递到异步方法中(后面的过程用Promise处理,然后通过
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
}