使用 Observables 发出同步 http 请求

Make synchronus http requests with Observables

我正在处理 angular 2 个项目。我必须制作 nhttp Requests。但是我需要等待从上一个请求中获取数据才能进行下一个请求。

如何使用 Observables 实现此目的。

我在做:

_.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});

来源自http://www.syntaxsuccess.com/viewarticle/combining-multiple-rxjs-streams-in-angular-2.0

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

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

}

进程登录(令牌){

let headers = new Headers({ 'Authorization': 'Bearer facebook ' + token });
let options = new RequestOptions({ headers: headers });

return this.http.get('http://localhost:8000/user-profile/', options)

}

这里我使用了rxjs Observable和rxjs Subject。我建议阅读这篇文章:http://blog.angular-university.io/how-to-build-angular2-apps-using-rxjs-observable-data-services-pitfalls-to-avoid/

fbResponse.next(response.authResponse);

解决 this.fb.login 后,在 fbResponse Subject 上调用下一步以进一步处理 fb.login 响应。

.map((far: FacebookAuthResponse) => far.accessToken)

此处的映射用于从 fbLogin 响应中获取 accessToken。

接下来会发生什么不是您的问题的一部分,但可能很有趣。

.mergeMap(accessToken => this.processLogin(accessToken))
.subscribe(res => userProfile.next(res));

mergeMap 让我们订阅请求链中的最后一个调用,return 该值。

因此,当我们订阅此登录请求时,上次调用的用户配置文件会在所有请求同步完成后 returned。