У меня есть две службы.Наблюдаемое событие и xhr.upload.onprogress
1) UploadService
- отправить файл через в AJAX на сервер, а также получить и значение магазина прогресс (внутри обработчика событий xhr.upload.onprogress)
2) SomeOtherService
работал с DOM, получить значение прогресса от первой услуги, отобразили его на панели результатов Bootstrap.
Потому что, xhr.upload.onprogress
является asynchronious - я использую Observable
в первой услуги:
constructor() {
this.progress$ = new Observable(observer => {
this.progressObserver = observer
}).share();
}
private makeFileRequest (url: string, params: string[], files: File[]): Promise<any> {
return new Promise((resolve, reject) => {
let formData: FormData = new FormData(),
xhr: XMLHttpRequest = new XMLHttpRequest();
for (let i = 0; i < files.length; i++) {
formData.append("uploads[]", files[i], files[i].name);
}
xhr.onreadystatechange =() => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.response));
} else {
reject(xhr.response);
}
}
};
xhr.upload.onprogress = (event) => {
this.progress = Math.round(event.loaded/event.total * 100);
this.progressObserver.next(this.progress);
};
xhr.open('POST', url, true);
xhr.send(formData);
});
}
Insise второй сервис, я подписаться на этот наблюдатель:
this.fileUploadService.progress$.subscribe(progress => {
this.uploadProgress = progress
});
this.fileUploadService.upload('/api/upload-file', [], this.file);
Теперь моя проблема:
Этот код не работает. Во втором сервисе я получаю наблюдаемое значение только один раз, на 100%.
Но если я вставить (да, с пустым телом обратного вызова)
setInterval(() => {
}, 500);
внутри методы makeFileRequest - я получу значение прогресса внутри второй службы каждые 500 миллисекунд.
private makeFileRequest (url: string, params: string[], files: File[]): Promise<any> {
return new Promise((resolve, reject) => {
let formData: FormData = new FormData(),
xhr: XMLHttpRequest = new XMLHttpRequest();
for (let i = 0; i < files.length; i++) {
formData.append("uploads[]", files[i], files[i].name);
}
xhr.onreadystatechange =() => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.response));
} else {
reject(xhr.response);
}
}
};
setInterval(() => {
}, 500);
xhr.upload.onprogress = (event) => {
this.progress = Math.round(event.loaded/event.total * 100);
this.progressObserver.next(this.progress);
};
xhr.open('POST', url, true);
xhr.send(formData);
});
}
Что это? Почему это произошло? Как я могу исправить использование Observable с событием onprogress
без этого setInterval?
UPD: после того, как Тьерри TEMPLIER ответ внутри
this.service.progress$.subscribe(data => {
console.log('progress = '+data);
});
я получил правильные значения, но значения динамически, только на 100% снова не обновляется внутри шаблона.
Я обновил свой ответ с plunkr ... –
Спасибо, теперь внутри '$ .subscribe ( данные this.service.progress => { console.log ('прогресс =' + данные) }); ' У меня есть правильные значения, но эти значения не обновляются внутри шаблона. –
важная вещь - внутреннее обновление шаблона шага на 100% –