Таймер RXJS продолжает работать после того, как оператор takeWhile возвращает «ложь» - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь настроить простую очередь, затем опрашивать, пока не завершится механизм стилей с использованием rxjs Observables, и изо всех сил пытался выяснить, что я делаю неправильно.

У меня есть следующий код

siteService.queue("123")  //(1) Queues a processing task
        .pipe(
            switchMap((res) => {
                console.log("Polling for changes...");
                return timer(100, 2000)  //(2)
                    .pipe(
                        flatMap(() => {
                            console.log("Fetching Site...");
                            return siteService.get("123);  //(3)
                        }),
                        takeWhile((res: SiteResponse) => {
                             let r = res.site.site_generation_status !== 'Current';
                            console.log("Take While", r); //(4)
                            return r;
                        })
                    );
            })
        )
        .subscribe((res) => {
            console.log("Result", res);
        }, (err) => {
            console.error("Error", err);
        }, () => {
            console.log("Done")
        });

Этот код должен поставить в очередь некоторый запрос на обработку (1), который затем установит site_generation_status объекта сайта в 'Queued' и будет выполнен некоторым внутренним процессом, который в конечном итоге обновит статус до 'Current' , Идея состоит в том, что таймер (2) должен сначала получить результат через 100 мс, а затем запускать каждые 2000 мс, пока не будет получено значение generation_status.

Этот код в основном работает, однако, вызов в (3) продолжает выполняться после того, как takeWhile (4) оценивается как ложное

Вот какой-то вывод консоли

Polling for changes...
Fetching Site...
Take While true
Result {site: {…}}
Fetching Site...
Take While true
Result {site: {…}}
Fetching Site...
Take While true
Result {site: {…}}
Fetching Site...
Take While false
Done
Fetching Site...
Fetching Site...
Fetching Site...
Fetching Site...

Есть ли у кого-нибудь какие-либо идеи относительно того, что может вызывать продолжение выполнения команды в (3) после того, как takeWhile оценивается как true и подписка заканчивается (обозначается как «Готово» в выходных данных журнала)

1 Ответ

1 голос
/ 20 марта 2019

Аааа ... Мне нужно разобраться в проблеме через 5 минут после публикации вопроса ..

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

Проблема была импортирована благодаря моей IDE

import { timer } from "rxjs/internal/observable/timer";

, но правильный импорт -

import { timer } from 'rxjs';

ипо волшебству мой код работает как положено

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