возврат ненаблюдаемого плоского значения из вложенного concatMap - PullRequest
0 голосов
/ 25 февраля 2019

Мой сценарий использования выглядит следующим образом:
У меня есть некоторая наблюдаемая цепочка, и в какой-то момент мне нужно получить дополнительную информацию из веб-службы и на основе разрешенной информации я хотел бы продолжить цепочку или остановить ее, выбрасывая.

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

Следующий код работает хорошо:

/* Begin of chain */
        .concatMap<Type, Type>((pld: Type) => {
            return this.appService.getInfo()
            .concatMap<string, Type>((info) => {
                if (someFailingCondition(info)) {
                    Observable.throw(`Failed`);
                }
                /* Pass-through operation */
                return Observable.of(pld);
            });
        })
/* Rest of chain */

Но я бы хотел отбросить внешний concatMap в пользу простого map работать с простыми значениями только с точки зрения основной цепи.Я пришел с concatAll решением:

/* Begin of chain */
        .map<Type, Type>((pld: Type) => {
            return this.appService.getInfo()
            .concatMap<string, Type>((info) => {
                if (someFailingCondition(info)) {
                    Observable.throw(`Failed`);
                }
                /* Pass-through operation */
                return Observable.of(pld);
            })
            .concatAll()
        })
/* Rest of chain */

Но мне интересно, есть ли какой-нибудь другой способ плоской внутренней серии наблюдаемых в плоскую трубу значений еще раз после concatMap -из их в рядах внутренних операторов?

1 Ответ

0 голосов
/ 25 февраля 2019

Ваш код уже достаточно прост, иногда невозможно сгладить все наблюдаемые в цепочке, вы можете просто перейти к следующему, на самом деле не нужно concatAll

/* Begin of chain */
        .concatMap<Type, Type>((pld: Type) => {
            return this.appService.getInfo()
            .map<string, Type>((info) => {
                if (someFailingCondition(info)) {
                  throw(`Failed`);
                }
                /* Pass-through operation */
                return pld;
            })
        })
/* Rest of chain */
...