Javascript 使用可观察对象发出synchronus http请求
我正在从事angular 2项目。我必须发出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 }
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));