我已经正式找到了解决方案。在此article的帮助下,仔细阅读并了解http-events的使用。终于弄明白是自己写的写代码,只是没测试好,因为没有使用文件上传所以http进度太快了。
所以这是我所做的一个示例。
在我的 provider.ts
publishSomeAPI(data) {
const req = new HttpRequest('POST', `${url}/someAPIEndpoint`, data, {
// headers: You can put your headers type hear such as content/type, token...
reportProgress: true
});
return new Promise((resolve, reject) => {
this.http.request(req).subscribe((event: HttpEvent<any>) => {
switch (event.type) {
case HttpEventType.Sent:
console.log('Request sent!');
this.getHttpEvent().next(event);
break;
case HttpEventType.ResponseHeader:
console.log('Response header received!');
this.getHttpEvent().next(event);
break;
case HttpEventType.UploadProgress:
this.getHttpEvent().next(event);
const percentDone = Math.round(100 * event.loaded / event.total);
console.log(`Posting in progress! ${percentDone}% \n
Bytes being upload: ${event.loaded} \n
Total no. of bytes to upload: ${event.total}`);
break;
case HttpEventType.Response:
this.getHttpEvent().next(event);
console.log('Done!', event.body);
resolve(event);
}
}, err => {
console.log(err);
reject(err)
});
});
}
我还创建了一个 observable,它将观察和监听我在上面创建的事件。
在我的 provider.ts 文件顶部。
private httpEventListener: Subject<Object> = new Subject<Object>();
observeHttp: Observable<Object> = this.httpEventListener.asObservable();
下面。
getHttpEvent(): Subject<Object> {
return this.httpEventListener;
}
在 service-provider.ts 中创建 observable 后,您现在可以根据执行或请求的 http 事件开始侦听该 observable。
现在在您的 page.ts 中导入您创建 observable 的 service 或 provider 并将此代码放在下面的构造函数或您想要执行的任何生命周期事件中.
this.someService.observeHttp.subscribe(data => { console.log(`An http event happened: ${JSON.stringify(data, null, '\t')}`) })
现在您可以在 UI 中进行一些状态更改或基于该 http 事件执行另一个事件,因为您现在正在侦听我们创建的 observable。
我发现这个ngx-loading-bar 对跟踪事件进度或加载程序很有用。
注意: 使用带有简单文本数据的文件上传,而不仅仅是小文本数据,因为没有文件的小块数据在在线时总是会返回 100%,或者即使在低端或无连接的 NaN 或中端设备。