Angular 如何使用RXJS解决深层对象请求
我需要请求一个端点,并且从这个端点,需要创建/请求下一个端点,但这需要同时完成,就像这样,当我订阅接收结果时,所有下一个“承诺”需要已经解决Angular 如何使用RXJS解决深层对象请求,angular,promise,rxjs,Angular,Promise,Rxjs,我需要请求一个端点,并且从这个端点,需要创建/请求下一个端点,但这需要同时完成,就像这样,当我订阅接收结果时,所有下一个“承诺”需要已经解决 import { forkJoin } from 'rxjs'; import { map, mergeMap, switchMap } from 'rxjs/operators'; import { fromFetch } from 'rxjs/fetch'; // https://api.github.com/users?per_page=5 --
import { forkJoin } from 'rxjs';
import { map, mergeMap, switchMap } from 'rxjs/operators';
import { fromFetch } from 'rxjs/fetch';
// https://api.github.com/users?per_page=5 -- **Used just to explain**
fromFetch('https://api.github.com/users?per_page=5').pipe(
switchMap(res => res.json()),
mergeMap(item => item),
map((item: any) => {
item.my_object_base = {
// This result need be "completed" join with the current request
next_item: fromFetch(item.repos_url).pipe(
switchMap(res => res.json()),
)
}
return item;
}),
// which pipe should i run to solve the nexted Observable?
).subscribe((res) => {
console.log(res)
/**
{
...
my_object_base : {
next_item: Observable // This still is a observable
}
...
}
**/
})
如何解决这个问题?我愿意听取意见和另一种解决问题的正确方法更新:我简化了一点逻辑,应该做我“认为”你试图完成的事情 试着这样做:
this.user$ = this.http.get<GithubUser>('https://api.github.com/users/mojombo');
this.hisFirstRepoName$ = this.user$.pipe(
switchMap(user => this.http.get(user.repos_url).pipe(map(repos => repos[0].name))),
);
this.data$ = combineLatest([this.user$, this.hisFirstRepoName$]).pipe(
map(([user,hisFirstRepoName]) => `${user.login}:${hisFirstRepoName}`),
);
this.user$=this.http.get('https://api.github.com/users/mojombo');
this.hisFirstRepoName$=this.user$.pipe(
switchMap(user=>this.http.get(user.repos\u url).pipe(map(repos=>repos[0].name)),
);
this.data$=CombineTest([this.user$,this.hisFirstRepoName$]).pipe(
map(([user,hisFirstRepoName])=>`${user.login}:${hisFirstRepoName}`),
);
工作演示:
我不知道为什么这项提案被否决了。。。但如果你能用一个例子来说明你的问题,这会有帮助。通常,使用类似于
combinelatetest
的方法将确保在继续之前每个可观察对象都会发出信号。如果你是这么问的,我可以举个例子。是的,我认为你到底想做什么令人困惑。这段代码本身并没有告诉我们您试图检索多少页用户,也没有告诉我们您想要什么数据。提供一个真实的例子,要么尝试工作,要么工作,但没有返回正确的结果,你会得到反馈。好的,这也是我需要的。谢谢…这里有两个例子说明了我如何解决这个问题@达米安-c
this.user$ = this.http.get<GithubUser>('https://api.github.com/users/mojombo');
this.hisFirstRepoName$ = this.user$.pipe(
switchMap(user => this.http.get(user.repos_url).pipe(map(repos => repos[0].name))),
);
this.data$ = combineLatest([this.user$, this.hisFirstRepoName$]).pipe(
map(([user,hisFirstRepoName]) => `${user.login}:${hisFirstRepoName}`),
);