в моем приложении Angular есть страница загрузки.Загрузка обрабатывается службой и запускается эффектом NGRX.
// service
public upload(file: File): any {
const formData: FormData = new FormData();
formData.append('file', file, file.name);
// create a http-post request and pass the form
// tell it to report the upload progress
const request = new HttpRequest('POST', url, formData, {
reportProgress: true
});
return this.httpClient.request(request);}
// Effect
@Effect({ dispatch: false })
uploadFile = this.actions
.ofType(ActionTypes.UploadFile)
.map(toPayload)
.switchMap(file =>
this.service.upload(file).map(event => {
if (event.type === HttpEventType.UploadProgress) {
// calculate the progress percentage
const percentDone = Math.round(100 * event.loaded / event.total);
this.store.dispatch(new UpdateUploadProgressAction(percentDone));
} else if (event instanceof HttpResponse) {
if (event.status >= 400) {
console.error(event);
this.store.dispatch(new UploadFileFailureAction(event));
} else {
this.store.dispatch(new UploadFileSuccessAction(event.body));
}
}
})
);
Поскольку загрузка может занять некоторое время (по крайней мере, проверка файла), я хочу предоставить пользователю возможность прервать отложенный запрос.
Обычно вы можете использовать метод отмены подписки следующим образом:
cons sub = this.service.upload(file);
...
sub.unsubscribe();
Но я понятия не имею, как сделать это внутри эффекта.Любые предложения или лучшие практики?
Спасибо :)