我刚开始使用Angular 2应用程序进行一些http调用,这引入了我的Observables。我仍然很难学习如何处理它们,文档对初学者来说有点缺乏。我举一个简短的例子来说明我遇到的困难:
getValue() {
let headers = new Headers({ 'Content-Type': 'text/plain' });
let options = new RequestOptions({ headers: headers });
return this.http.get('http://url/boolean.json', options)
}
这是一个返回布尔值的get调用。现在如果我想在函数中使用这个值,我会本能地期望我可以像这样分配一个变量:
let varName = this.getValue()
显然这是不可能的,我读到为了从一个观察者获得输出,你需要订阅它。是不是有可能让我的函数getValue()返回一个布尔值而不是一个可观察的?但是在这种情况下,由于我只需要有布尔值,我不确定异步编程是否有意义?这不会花费很长时间。在Angular 2中是否还有一种方法可以摆脱这种异步行为(对于像这样的简单函数?)?
答案 0 :(得分:2)
你可以"模拟"使用Angular2的async
管道的伪同步模式:
<div>{{value | async}}</div>
在这种情况下,value
是可观察的,而不是HTTP响应的内容。
这样Angular2就会为您订阅并管理相应的订阅。收到数据后,模板会相应更新。
您实际上可以绕过异步模式,因为它是基础API(XMLHttpRequest)执行HTTP请求(更常见的是JavaScript)的工作方式。
您可以注意到Rx / Observable对链处理非常强大。例如,您可以利用flatMap
之类的运算符,并且只能在链的末尾订阅。这是一个示例:
this.getValue().flatMap((data) => {
// return another observable
return this.getAnotherRequest();
}).subscribe((data) => {
// data is the result of the second request
});
这个Rx教程可以帮助你:
修改强>
以下是利用运营商的方法:
this.getCurrentUser().flatMap((user) => {
// return another observable
return this.getData(user);
}).subscribe((data) => {
// data is the result of the second request
}, (err) => {
// no current user, ...
});