Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 修改可观察列表中的每个项目,并将修改后的列表作为可观察列表再次返回_Javascript_Rxjs - Fatal编程技术网

Javascript 修改可观察列表中的每个项目,并将修改后的列表作为可观察列表再次返回

Javascript 修改可观察列表中的每个项目,并将修改后的列表作为可观察列表再次返回,javascript,rxjs,Javascript,Rxjs,查找方法具有以下意义 find(): Observable<User[]> 我的目标是对列表中的每个用户运行异步操作。该异步操作应该通过添加一些字段来修改元素。最后,应发出已更新用户的列表。这就是我尝试过的: return this.service.find() .mergeMap((users: User[]) => Observable.from(users)) .mergeMap((user: User) => { return t

查找方法具有以下意义

find(): Observable<User[]>
我的目标是对列表中的每个用户运行异步操作。该异步操作应该通过添加一些字段来修改元素。最后,应发出已更新用户的列表。这就是我尝试过的:

return this.service.find()
    .mergeMap((users: User[]) => Observable.from(users))
    .mergeMap((user: User) => {
        return this.anotherService.getAdditionalData(user.id)
            .map((res: any) => {
                // return edited user
            })
    })
    // How to return User[] here?
使用第一个mergeMap,将为列表中的每个用户创建一个可观察的对象。然后对每个可观察到的用户执行另一个异步操作。异步操作返回已编辑的用户

最后,我的问题是,如何返回包含已编辑用户的用户列表。或者,如何在列表中收集已编辑的用户并返回此列表?

此操作有操作员:

功能修改(v){
返回Rx.Observable.of('modified:'+v)
.延迟(数学随机()*1000);
}
const users=Array.from({length:10})
.map((u,i)=>i);
从(用户)处可观察到的接收
.mergeMap(v=>modify(v))
.toArray()
.subscribe(e=>console.log(e))

我想这正是你想要的:

函数异步操作(用户){
返回Rx。可观察
.timer(3000*Math.random())
.map(()=>{
user.isModified=true;
返回用户;
}).do((x)=>{console.log('async',x);});
}
常量用户=[
{id:1,名称:'First'},
{id:2,名称:'Second'},
{id:3,名称:'Third'}
];
(用户)的可观测接收
.switchMap((u)=>Rx.Observable.forkJoin(u.map(x=>asyncOperation(x)))
.subscribe((x)=>{console.log('final',x);})

非常优雅的解决方案。谢谢@bygrace!
return this.service.find()
    .mergeMap((users: User[]) => Observable.from(users))
    .mergeMap((user: User) => {
        return this.anotherService.getAdditionalData(user.id)
            .map((res: any) => {
                // return edited user
            })
    })
    // How to return User[] here?