RxJS toArray не вызывается - PullRequest
       1

RxJS toArray не вызывается

0 голосов
/ 17 декабря 2018

У меня есть последовательность RxJS следующим образом:
(элемент управления Angular FormControl)

control.valueChanges.pipe(
    concatMap(cronExprs => from(cronExprs as Array<string>)),
    concatMap(cron => this.invokeCronService(cron)),
    toArray()
).subscribe(cronExprs => this.setCronExpressionModels(cronExprs))

Скажем, в массиве cronExprs есть три элемента ['..', '..', '..'].Я вижу, что во время отладки clojure concatMap(cron => this.invokeCronService(cron)) вызывается три раза, но никогда не вызывается toArray, и очевидно, что clojure подписки тоже никогда не вызывается.Кажется, последовательность не завершается правильно.

invokeCronService:

private readonly invokeCronService =
    (cron: string): Observable<CronExpressionModel> =>
        this.cronService.describeCron(cron).pipe(
            map(result => result.get()),
            map((description): CronExpressionModel => ({ cron, description }))
        )

describeCron - это просто:

public describeCron(cronExpression: string): Observable<Result<string>> {
    return of(Result.valid('', cronExpression))
}

Что я делаю не так?

1 Ответ

0 голосов
/ 17 декабря 2018

Оператор toArray будет испускать свой буфер только после завершения его источника Observable.

В вашем случае ваш источник - control.valueChanges, который никогда не завершается, поэтому toArray никогда ничего не испустит.Это зависит от того, чего вы хотите достичь, но вы можете использовать scan() для сбора всех выбросов при отправке всех промежуточных результатов или использовать take(1) в качестве первого оператора, который обеспечит завершение цепочки после первого выброса из valueChanges.

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