我有这个功能:
uploadFiles(files: FileToUpload[]) {
return Observable.create(async (observable) => {
const aborters: Aborter[] = [];
for (const fileToUpload of files) {
let uploadResponse: UploadResponse;
const aborter = Aborter.none;
aborters.push(aborter);
try {
uploadResponse = await this.upload(file)
} catch (err) {
}
}
return () => {
console.log('coooo');
this.files$.next([]);
for (const aborter of aborters) {
if (!aborter.aborted) {
aborter.abort();
}
}
};
});
}
如果要进行下载,那么当用户从apge导航时,我希望此可观察对象能够取消,因此我将返回取消订阅调用时调用的函数。
然后我这样订阅:
this.uploadSubscription = this.uploadService.uploadFiles(this.control.value).subscribe(
() => console.log('progress'),
(e) => {
console.log(`errored with ${e}`);
this.uploadSubscription.unsubscribe();
},
() => {
console.log('completed');
this.uploadSubscription.unsubscribe();
}
);
我有一个ngOnDestroy
,像这样:
ngOnDestroy() {
if (this.uploadSubscription) {
this.uploadSubscription.unsubscribe();
}
}
但是,即使调用了unsubscribe方法,也不会调用从Observable.create
返回的回调。
答案 0 :(得分:1)
我认为问题在于,从<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html>
<body>
<div>
<div class="externalLink">A</div>
</div>
<div>
<div class="externalLink">B</div>
</div>
<div>
<div class="externalLink">C</div>
</div>
<div>
<div class="externalLink">D</div>
</div>
<div>
<div class="externalLink">E</div>
</div>
<div>
<div class="externalLink">F</div>
</body>
</html>
回调中,您实际上返回的是Promise而不是拆卸方法。
您使用Observable.create
关键字标记了该回调,因此它返回一个Promise,因此当您以后调用async
时,实际上是在返回return () => {}
,因此它从未被调用。即使打电话给Promise<() => void>
也没有。
您必须重新构造链,以使其无法订阅,具体取决于您要执行的操作,但是似乎您甚至不需要使用unsubscribe
,因为您永远不会将任何通知推送到{{ 1}}。