Как выполнить действие после завершения нескольких подписок / разрыва - PullRequest
1 голос
/ 20 сентября 2019

Я создаю ионный освежитель.У меня есть компонент, который выполняет несколько запросов на получение.Каждый из них по-своему.Я пытаюсь реализовать то, что я хочу выполнить event.target.complete() после того, как все подписки сделаны.Вот что я пытался сделать:

private _dataFromOne;
private _dataFromTwo;

ngOnInIt() {
    this.getAllData();
}

/*This method will be called from HTML as well with $event*/
private getAllData(event = null) {
    if ($event) {
          // So if it was only one method, then this would work
        this.methodOne().add(() => {
            event.target.complete()  // teardown logic. End when _subOne is unsubscribed
        });
        // This is where I'm confused. How do I do it when subscription from both method is unsubscribed?
        // this.methodTwo();
    } else {
        this.methodOne();
        this.methodTwo();
    }
}

private methodOne() {
    return this.doGetRequest.get().subscribe((data) => {
        this._dataFromOne = data;
    });
}

private methodTwo() {
    return this.doSomeGetRequest.get().subscribe((data) => {
        this._dataFromTwo = data;
    });
}

Буду признателен за любую помощь в указании меня в правильном направлении.Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Вы можете попробовать вернуть Observable из двух методов и объединить их в один:

private getAllData(event = null) {
    merge(
        this.methodOne(),
        this.methodTwo()
    ).pipe(
        finalize(() => {
            if (event) {
                event.target.complete();
            }
        }),
    ).subscribe();
}


private methodOne() {
    return this.doGetRequest.get().pipe(tap(data => {
        this._dataFromOne = data;
    }));
}

private methodTwo() {
    return this.doSomeGetRequest.get().pipe(tap(data => {
        this._dataFromTwo = data;
    }));
}

или без tap (побочные эффекты вне подписки):

private getAllData(event = null) {
    forkJoin(
        this.methodOne(),
        this.methodTwo()
    ).subscribe(([data1, data2]) => {
        this._dataFromOne = data1;
        this._dataFromTwo = data2;
    }, err => {
        //what do you do if one of them fails?
    }, () => {
        if (event) {
            event.target.complete();
        }
    });
}


private methodOne() {
    return this.doGetRequest.get1();
}

private methodTwo() {
    return this.doSomeGetRequest.get2();
}
1 голос
/ 20 сентября 2019

Вы можете инкапсулировать Observable в функцию, которая разрешает Обещание после получения результатов, складывать все эти Обещания в массив Promise и использовать Promise.All ()

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