#angular #typescript #rxjs
Вопрос:
Во время работы с машинописным текстом у меня возникли некоторые проблемы с объединением наблюдаемых объектов таким образом, чтобы это имело смысл. Итак, в этом примере, который я написал, я условие, которое будет зависеть от его значения, либо выполнит функцию, либо выполнит некоторую предварительную обработку перед выполнением функции.
При этом я заметил, что проблемная область пытается вернуть Observablelt;Observablelt;numbergt;gt;
то, к чему я не стремился. Моей мыслью было вернуть внутреннюю ценность, но я не был уверен, как на самом деле это обработать.
b(data: number): Observablelt;numbergt; { return of(data); } // This is a stub. a(data: number): Observablelt;numbergt; { const fn = (x): Observablelt;numbergt; =gt; { return of(x) // this is a stub which would be the result of an http request. } if(data lt; 3) { return fn(data); } else { return b(data).pipe(map( x =gt; fn(x) )) // Problem line } }
Как это предполагается обработать? Я думал, что, возможно, есть способ справиться с этим, используя обещание, но я подумал, что это повредит сигнатурам функций, так как мне нужно будет пометить их как асинхронные. Я в тупике и хотел бы получить некоторые рекомендации.
Комментарии:
1. Вместо карты попробуйте использовать карту переключения. На карте, которую вы хотите вернуть, вы возвращаете наблюдаемое там значение..
2. итак, вы думаете:
return b(data).pipe(switchMap( x =gt; fn(x)))
определенно кажется, что intellisense больше не психует. позвольте мне это проверить. 🙂
Ответ №1:
Проблема, с которой вы столкнулись, заключается в том, что одно условие возвращает наблюдаемое, в то время как другое возвращает наблюдаемое, которое возвращает наблюдаемое. Вы должны использовать один из операторов выравнивания, таких как switchMap, concatMap или mergeMap.
return b(data).pipe(switchMap(x =gt; fn(x)))
Может быть, это также может выиграть от редизайна? Вместо того, чтобы иметь два отдельных возврата, создайте поток из результата условного оператора и передайте его в функцию. Таким образом, вам не нужно определять функцию только для того, чтобы вы могли использовать ее в двух местах.
b(data: number): Observablelt;numbergt; { return of(data); } // This is a stub. a(data: number): Observablelt;numbergt; { const src$ = data lt; 3 ? of(data) : b(data); return src$.pipe(switchMap(x =gt; of(x) /* your stub function */)); );
Комментарии:
1. По — видимому, это правильный способ действий. Я забыл о карте переключения.