не может отменить наблюдаемое из rxjs 5.0 - PullRequest
0 голосов
/ 01 марта 2019

У меня есть эта функция:

 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();
    }
  }

Но даже несмотря на то, что вызывается метод отписки,обратный вызов, полученный из Observable.create, не вызывается.

1 Ответ

0 голосов
/ 01 марта 2019

Я думаю, что проблема в том, что из обратного вызова Observable.create вы на самом деле возвращаете Promise, а не метод разрыва.

Вы пометили обратный вызов ключевым словом async, поэтому он возвращает Promise, так чтокогда вы позже звоните return () => {}, вы на самом деле возвращаете Promise<() => void>, поэтому он никогда не вызывается.Даже когда вы звоните unsubscribe.

. Вы должны были бы реструктурировать цепочку, чтобы отменить подписку, в зависимости от того, что вы хотите сделать, но кажется, что вам даже не нужно использовать awaitпотому что вы никогда не отправляете уведомления на observer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...