使用 Observables 发出同步 http 请求
Make synchronus http requests with Observables
我正在处理 angular 2 个项目。我必须制作 n
个 http 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。
我正在处理 angular 2 个项目。我必须制作 n
个 http 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。