无法从rxjs 5.0取消可观察

时间:2019-03-01 12:23:40

标签: rxjs

我有这个功能:

 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返回的回调。

1 个答案:

答案 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}}。