大佬教程收集整理的这篇文章主要介绍了RxJS将数组映射到可观察数据并返回到数组中的普通对象,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
[ { "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; } ); }
这适用于我插入单个对象的情况.但是,我想添加对插入多个对象的支持,这些对象只调用单个插入的方法.目前这就是我所拥有的,但它不起作用:
insertAll(users: User[]): Observable<User[]> { return Observable.forkJoin( users.map(user => this.insert(user)) ); }
insertAll方法正在按预期插入用户(或者用该用户填充数据库的其他内容),但我没有得到任何回复.我正在调试正在发生的事情,似乎forkJoin只是从第一个映射用户获得响应,但其他人被忽略.订阅insertAll没有做任何事情,也没有任何错误通过insertAll上的catch或订阅insertAll中的第二个参数.
所以我正在寻找一种解决方案,其中Observable(在insertAll中)将以该形式向用户发回一系列新对象:
[ { "id": 1,"name": "John",{ "id": 2,"name": "Anna",{ "id": 3,"name": "Joe",{ "id": 4,"name": "Alexandra",... ]
对于任何指向正确方向的建议,我会非常高兴.提前致谢!
Rx.Observable.from(array)
.
要从observable转换为数组,请使用obs.toArray()
.请注意,这会返回一个数组的可观察对象,因此您仍然需要.subscribe(arr => …)才能将其删除.
也就是说,使用forkJoin
的代码看起来确实正确.但如果你想尝试,请编写如下代码:
insertAll(users: User[]): Observable<User[]> { return Observable.from(users) .mergeMap(user => this.insert(user)) .toArray() ); }
另一种更像rx的方法是在完成时发出值,而不是像forkJoin或toArray
那样等待所有值.我们可以省略上一个例子中的toArray
,我们得到了它:
insertAll(users: User[]): Observable<User> { return Observable.from(users) .mergeMap(user => this.insert(user)) ); }
正如@cartant所提到的,问题可能不在Rx中,它可能是您的数据库不支持多个连接.在这种情况下,您可以将mergeMap
替换为concatMap
,以使Rx仅发送1个并发请求:
insertAll(users: User[]): Observable<User[]> { return Observable.from(users) .concatMap(user => this.insert(user)) .toArray() // still optional ); }
以上是大佬教程为你收集整理的RxJS将数组映射到可观察数据并返回到数组中的普通对象全部内容,希望文章能够帮你解决RxJS将数组映射到可观察数据并返回到数组中的普通对象所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。