Как работает канал RxJS (допустимые операторы)

Это на самом деле заметка для себя, но это может быть полезно для других.

Итак, вот 2 куска кода и мой вопрос в гиттере:

В чем разница между этими двумя?:

    @Effect()
    loadRegistrationsFailed$: Observable<Action> = this.actions$
        .ofType(registrations.LOAD_FAIL)
        .pipe(
            map(
                action =>
                    new ShowErrorDialogAction({
                        correlationId: new Guid(),
                        title: "Server is unreachable",
                        message:
                            "Can't load user registrations. Can't connect to the server"
                    })
            )
        );
```
and
```
    @Effect()
    loadRegistrationsFailed$: Observable<Action> = this.actions$
        .ofType(registrations.LOAD_FAIL)
        .pipe(action =>
            of(
                new ShowErrorDialogAction({
                    correlationId: new Guid(),
                    title: "Server is unreachable",
                    message:
                        "Can't load user registrations. Can't connect to the server"
                })
            )
        );

person alvipeo    schedule 11.11.2017    source источник


Ответы (1)


Спасибо Брандту Б., вот ответ:

это связано с тем, как работает функция канала. pipe уменьшает массив передаваемых ему функций. В предыдущем значении он выполняет функцию карты, которая хранит функцию, которую вы передали карте внутри. Во втором примере он выполняет действие => немедленно и возвращает его как результат конвейера. Поэтому результатом всего наблюдаемого является (действие), на которое подписывается библиотека эффектов, которая немедленно создает значение.


Ответ Доруса на тот же вопрос:

Разница между этими двумя образцами заключается в том, что первый будет отображать значения, а второй просто заменит все на of и проигнорирует все, что исходит от источника.

Правильный способ написать второй будет

@Effect()
loadRegistrationsFailed$: Observable<Action> = this.actions$
    .ofType(registrations.LOAD_FAIL)
    .pipe(ob => ob.mergeMap(action =>
        of(
            new ShowErrorDialogAction({
                correlationId: new Guid(),
                title: "Server is unreachable",
                message:
                    "Can't load user registrations. Can't connect to the server"
            })
        ))
    );

Поскольку вы не используете действие, вы также можете использовать mergeMapTo или mepTo:

@Effect()
loadRegistrationsFailed$: Observable<Action> = this.actions$
    .ofType(registrations.LOAD_FAIL)
    .pipe(ob => ob.mergeMapTo(of(
            new ShowErrorDialogAction({
                correlationId: new Guid(),
                title: "Server is unreachable",
                message:
                    "Can't load user registrations. Can't connect to the server"
            })
        ))
    );

Единственное, что добавляют допустимые операторы, это то, что вы можете написать .pipe(map()) вместо .pipe(ob => ob.map())

person alvipeo    schedule 11.11.2017