【发布时间】:2016-05-18 17:08:42
【问题描述】:
我有两个服务。
1) UploadService - 通过 ajax 将文件发送到服务器,并获取和存储进度值(在 xhr.upload.onprogress 事件处理程序中)
2) SomeOtherService 使用 DOM,从第一个服务获取进度值,将其显示在 Bootstrap 进度条上。
因为,xhr.upload.onprogress 是异步的 - 我在第一次服务中使用 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);
});
}
那是什么?为什么会这样?如果没有 setInterval,我如何正确使用 Observable 和 onprogress 事件?
UPD:在 Thierry Templier 内部回答之后
this.service.progress$.subscribe( data => {
console.log('progress = '+data);
});
我得到了正确的值,但这些值没有在模板内动态更新,只是再次更新到 100%。
【问题讨论】:
标签: typescript angular rxjs