попытка объединить http-запросы в цепочку и вернуть конечный результат в виде наблюдаемого

#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. По — видимому, это правильный способ действий. Я забыл о карте переключения.