Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.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
Angular 如何使用RXJS解决深层对象请求_Angular_Promise_Rxjs - Fatal编程技术网

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}`),
);