angular - почему наблюдаемая цепочка не завершается при передаче route.parame с помощью http.get с использованием switchMap

Почему первая цепочка не завершается?

Предполагается, что switchMap отменит подписку на предыдущую наблюдаемую, и, поскольку http.get является однократной наблюдаемой, я думал, что она будет завершена.

Вместо этого я продолжаю получать результаты http.get. Это то, что я ожидал от flatMap.

    this.route.params
        .pipe(
            switchMap(params => {
                return this.http.get('assets/data/module.json');
            })
        )

        .subscribe(
            res => {
                console.log(res);
            },
            e => e,
            () => console.log('complete')
        );

По умолчанию http.get приводит к завершению.

    this.http.get('assets/data/module.json').subscribe(
        res => {
            console.log(res);
        },
        e => e,
        () => console.log('complete')
    );

person Han Che    schedule 08.08.2018    source источник
comment
switchMap отписывается от предыдущего наблюдаемого http каждый раз, когда выпускаются новые параметры. Как это означает, что если предыдущая наблюдаемая http завершится, вся цепочка завершится? Это не так. У вас просто неверное предположение.   -  person JB Nizet    schedule 08.08.2018


Ответы (1)


Я думаю, вы неправильно поняли, что должен делать switchMap. switchMap отменит подписку на внутреннюю наблюдаемую (ваш http.get вызов), если будет испущен новый параметр. Он не отпишется от параметров после завершения вашего http.get вызова.

Что вы хотите, так это добавить оператор first() в свой канал перед вашим оператором switchMap. Также вы можете использовать mergeMap вместо switchMap, хотя в вашем случае это не имеет значения.

this.route.params
    .pipe(
        first(),
        switchMap(params => {
            return this.http.get('assets/data/module.json');
        })
    )

    .subscribe(
        res => {
            console.log(res);
        },
        e => e,
        () => console.log('complete')
    );

Это примет первый параметр, отправленный route.params, выдаст ваш http-запрос, а затем завершит наблюдаемое.

Пример того, какую карту переключения можно использовать: Допустим, у нас есть поле поиска, куда я могу ввести что угодно. Когда я ввожу что-то в поле поиска, angular вызывает серверную часть для получения результата поиска. Теперь может случиться так, что я изменю свой поисковый запрос, в то время как последний поисковый запрос все еще находится на рассмотрении. В этом случае switchMap отменит старый запрос на получение и выдаст новый.

person tom van green    schedule 08.08.2018