RxJS: пропустить условную карту слияния - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть такой метод обслуживания:

updateUser(article) {
        this.httpClient
            .put(`articles/${article.id}`, article)
            .pipe(
                map(res => res.response),
                mergeMap(updatedArticle =>
                    this.articlesTagsAPI.someMethod(updatedArticle.id).pipe(
                        map(tags => ({ ...updatedArticle, tags })),
                        article.articleType === 'news'
                            ? mergeMap(() =>
                                  this.articlesTagsAPI.someOtherMethod(updatedArticle.id, article.tags).pipe(
                                      map(() => {
                                          return {
                                              ...updatedArticle,
                                              tags: article.tags
                                          };
                                      })
                                  )
                              )
                            : null
                    )
                )
            );
}

, как вы можете видеть - я пытаюсь добавить условное mergeMap (если условие -> вызвать еще один метод), можно ли это сделатькак-нибудь?

, потому что возвращать ноль - не лучшая идея

что-то подобное должно произойти, если условное выражение недопустимо:

updateUser(article) {
            this.httpClient
                .put(`articles/${article.id}`, article)
                .pipe(
                    map(res => res.response),
                    mergeMap(updatedArticle =>
                        this.articlesTagsAPI.someMethod(updatedArticle.id).pipe(
                            map(tags => ({ ...updatedArticle, tags }))
                        )
                    )
                );
    }

1 Ответ

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

Как указано в этой очень полезной статье , правильный способ сделать это - добавить инструкцию of, чтобы всегда возвращать Observable его значение внутри вашей окончательной подписки.

Попробуйте это:

updateUser(article) {

    this.httpClient
        .put(`articles/${article.id}`, article)
        .pipe(
            map(res => res.response),
            mergeMap(updatedArticle =>
                this.articlesTagsAPI.someMethod(updatedArticle.id).pipe(
                    map(tags => ({ ...updatedArticle, tags })),
                    article.articleType === 'news'
                        ? mergeMap(() =>
                                this.articlesTagsAPI.someOtherMethod(updatedArticle.id, article.tags).pipe(
                                    map(() => {
                                        return {
                                            ...updatedArticle,
                                            tags: article.tags
                                        };
                                    })
                                )
                            )
                        : of(null)
                )
            )
        );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...