我的代码包含我用来将文件上传到我的
PHP服务器的简单函数(有一个嵌套在RxJS / Observable中的xhr请求):
fileUpload(file: File): Observable<any> { return new Observable( observer => { let xhr:XMLHttpRequest = new XMLHttpRequest(); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { if (xhr.status === 200) { observer.next(<any>JSON.parse(xhr.response)); } else { observer.error(xhr.response); observer.complete(); } } }; xhr.open('POST','__BACKEND__?action=file-upload',true); var formData = new FormData(); formData.append('file',file,file.name); xhr.send(formData); }); }
它完全正常,但现在我还想为它添加一些取消机制.
只是从Observable取消订阅将无法正常工作,因为我需要以某种方式调用xhr.abort()或者浪费宝贵的资源和大量上传.
解决方法
创建Observable时,可以通过从构建器函数返回Subscription或函数来指定取消订阅行为:
fileUpload(file: File): Observable<any> { return new Observable( observer => { let xhr:XMLHttpRequest = new XMLHttpRequest(); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { if (xhr.status === 200) { observer.next(<any>JSON.parse(xhr.response)); observer.complete(); } else { observer.error(xhr.response); } } }; xhr.open('POST',file.name); xhr.send(formData); //Return the tear down logic. //You may also want to check here that it has not already completed //Since this gets called in all cases when the `Subscription` terminates return () => xhr.abort(); }); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。