Javascript 使用可观察对象发出synchronus http请求

Javascript 使用可观察对象发出synchronus http请求,javascript,angular,rxjs,rxjs5,Javascript,Angular,Rxjs,Rxjs5,我正在从事angular 2项目。我必须发出n个http请求。但我需要等待从上一个请求中获取数据,才能发出下一个请求 我如何使用可观察对象实现这一点 我正在做: _.forEach(data, (path) => { this.userService.getTreeNodes(path.id) .subscribe( data => { //do something }

我正在从事angular 2项目。我必须发出
n
http请求
。但我需要等待从上一个请求中获取数据,才能发出下一个请求

我如何使用
可观察对象
实现这一点

我正在做:

_.forEach(data, (path) => {
        this.userService.getTreeNodes(path.id)
          .subscribe(
            data => {
              //do something
            }
          );
      });

现在,三个模拟请求正在进行。

flatMap-运算符是关键字,它将帮助您解决问题

flatMap是我们如何处理观测值之间的依赖关系的。我的样本是人为设计的,但我从第一个可观测值返回一个值,第二个可观测值需要这个值来计算和

就像我说的,这个例子是人为的,但是如果我们把它和承诺相比较,flatMap就是我们如何创建承诺链的等价物。代码如下所示

let first = Observable.of(10);
first.flatMap((operand1) => {
  return Observable.of(operand1 + 10);
})
.subscribe(res => this.flatMappedStreams = {msg: '10 + 10 = ' + res});

来源:这里是一个登录函数的示例,该函数首先从facebook获取accessToken,然后将该token发送到第二个服务以获取用户配置文件

login(): Observable<any> {

let fas: FacebookAuthResponse = {
  accessToken: null,
  expiresIn: null,
  signedRequest: null,
  userID: null,
};

let fbResponse: Subject<any> = new Subject();
let userProfile: Subject<any> = new Subject();

this.fb.login().then((response: FacebookLoginResponse) => {
    fbResponse.next(response.authResponse);
  }), (error: any) => {
  console.error(error);
};

fbResponse
  .map((far: FacebookAuthResponse) => far.accessToken)
  .mergeMap(accessToken => this.processLogin(accessToken))
  .subscribe(res => userProfile.next(res));

return userProfile
}

这里我使用rxjs Observable和rxjs Subject。我建议阅读这篇文章:

解析this.fb.login后,在fbResponse主题上调用next以进一步处理fb.login响应

.map((far: FacebookAuthResponse) => far.accessToken)
这里,map用于从fbLogin响应获取accessToken

.map((far: FacebookAuthResponse) => far.accessToken)
接下来会发生什么不是你问题的一部分,但可能会很有趣

.mergeMap(accessToken => this.processLogin(accessToken))
.subscribe(res => userProfile.next(res));
mergeMap让我们订阅请求链中的最后一个调用,并返回该值


因此,当我们订阅此登录请求时,当所有请求同步完成时,将返回上一次调用的用户配置文件。

您是否尝试过承诺。??我正在尝试使用Observable和rxjs Opartors来解决这个问题。你能发布你的代码吗?到目前为止你尝试了什么???@Manish代码添加如果他需要等待上一个httprequest完成
concatMap
可能更合适
.mergeMap(accessToken => this.processLogin(accessToken))
.subscribe(res => userProfile.next(res));