[英]Properly use Async calls with Angular 5
我已经谷歌搜索了几天,发现了许多不同的场景,关于如何使用Angular 5(或2-3-4,无论如何)使用异步API调用。
任何人都可以给我一些正确的例子(一些好的用例)吗?
恩。
谢谢 !
我会根据我的意见和我的学习方式给你一个asnwer。 所以不要把它当作绝对真理,而是要质疑它!
首先,您应该知道在Typescript中,有两种方法可以进行异步调用: Promises和Observables 。
Promise在ES6中是原生的,Observables是Rx JS的一部分。
因为我认为,我会告诉你使用Observables ,因为
所有这一切,Promises都做不到。
非常简单:首先,您需要导入负责该模块的模块:
import { HttpClientModule } from '@angular/common/http';
// ...
imports: [HttpClientModule]
这是Angular 5中新的和改进的http服务 。 我强烈建议你使用它,因为较旧的( Http
)很快就会过时。
现在,在您的服务中,您可以像这样使用HttpClient
import { HttpClient } from '@angular/common/http';
// ...
constructor(
private http: HttpClient
) {}
// ...
getAny(): Observable<any> {
return this.http.get<any>('url'); // request options as second parameter
}
在您的组件中,您现在可以执行此操作
import { MyService } from '../myservice/myservice.service';
// ..
constructor(private myService: MyService) {
this.myService.getAny().subscribe(() => {});
}
// ..
假设您要显示进度条或处理错误:为此,您必须使用拦截器 。 拦截器是在发送之前(或之后)捕获您的请求的服务,并且会执行某些操作。
这是一个简单的错误拦截器:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class ErrorHandlerService implements HttpInterceptor {
constructor() { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next
.handle(req)
.catch(err => {
console.log('error occured');
return Observable.throw(err);
});
}
}
要使用它,只需在模块中提供您的价值:
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: ErrorHandlerService, multi: true }
]
我想你猜对了,但你也可以用它来处理进度条;)
如您之前所见,您可以订阅http呼叫。
如果您想处理特定错误并在组件中执行某些逻辑,请按以下步骤操作:
myService.getAny().subscribe(
responseAfterSuccess => {},
responseAfterError => {}
);
使用此代码,您将处理成功和错误。
最后, 异步管道 :异步管道将Observable转换为数据。 要使用它,请执行此操作
this.myVar = myService.getAny();
你的变量myVar
将包含一个Observable。 现在,在你的HTML中,用这个
<div *ngFor="let item of myVar | async">{{ item }}</div>
Angular会在显示任何内容之前将数据到达,并将Observable转换为数据,就像您手动完成一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.