ForkJoin на NestJS не работает после перехода на более новую версию

Я запускаю приложениеnesjs и имею кусок кода, который использует forkJoin

const results: string[] = [];
const args = ['arg1', 'arg2', 'arg3', 'arg4', 'arg5', 'arg6'];

....
switchMap(() => {
   const setToHandle = [];
   args.forEach(arg => setToHandle.push(this.doWorksAndGetResult(arg)));
   return forkJoin(setToHandle);
}),
tap(() => {
   this.logService.debug(...results);
})

Так что это работает нормально, и я распечатал результаты в журнале. Но этот forkJoin(setToHandle) сейчас устарел и должен использоваться так forkJoin([setToHandle]) в соответствии с документацией. Но это не работает, результаты не печатаются в журнале, нет наблюдаемых, вызываемых внутри функции doWorksAndGetResult. Может ли кто-нибудь помочь мне с этим?

@churill код, который я привел выше, является копией рабочего кода. Он все еще работает, но с предупреждением об устаревании. Данная документация к нему, поэтому делаю как там описано. Даже когда я подписываюсь, это не работает.

Vegas Rico 10.01.2023 14:43
Promise v/s Observable в Angular
Promise v/s Observable в Angular
В системах Push производитель определяет, когда отправить данные потребителю. Потребитель не знает, когда он получит эти данные.
Подсказка RxJS [filter, skipWhile]
Подсказка RxJS [filter, skipWhile]
Эта подсказка описывает разницу между операторами filter и skipWhile из библиотеки RxJS .
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
2
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После добавления достаточного количества кода, чтобы заставить ваш пример работать, я обнаружил, что строгий ввод setToHandle устранил проблему. (По крайней мере, в моей версии вашего кода.)

const setToHandle: string[] = [];

В противном случае я думаю, что языковая служба запуталась.

ОБНОВЛЕНИЕ на основе ваших комментариев:

Эта инициализация недействительна:

const setToHandle: Observable<void> = []; 

Вы не можете инициализировать Observable<void> пустым массивом []. И вы не можете позже в своем коде push на Observable<void>

Не могли бы вы предоставить нам достаточно рабочего кода, чтобы мы лучше поняли, что вы пытаетесь сделать. См. этот Stackblitz для начала: https://stackblitz.com/edit/angular-ivy-yp3ocd

ОБНОВЛЕНИЕ 2 на основе ваших более поздних комментариев:

ForkJoin() takes in an array.

const setToHandle: Observable<boolean>[] = [];

SetToHandle уже определен как массив.

Передача [setToHandle] помещает массив в другой массив.

Если вам действительно нужно использовать квадратные скобки, то это работает:

return forkJoin([...setToHandle]);

Оператор распространения (...) расширяет массив.

Привет, Дебора. Спасибо за ваше время и усилия, чтобы помочь мне с этой проблемой, я очень ценю это. К сожалению, это тоже не помогло. ` const setToHandle: Observable<void> = []; ` Внутри кода функции doWorksAndGetResult, который достигает базы данных ` return from(this.typeORM.query('SELECT ....')) .pipe( switchMap((res) => { console.info("Я здесь !!!"); // делаем что-то this.results.push(some_variable); return of(); })); `

Vegas Rico 13.01.2023 12:51

Не попадает в console.info("Я здесь!!!")

Vegas Rico 13.01.2023 12:52

Смотрите мое обновление выше.

DeborahK 13.01.2023 20:28

Привет, Дебора. Пожалуйста, посмотрите здесь

Vegas Rico 15.01.2023 09:57

Я использую приведенную выше ссылку и не вижу проблемы?

DeborahK 16.01.2023 18:23

Привет @Дебора. здесь Я изменил код, чтобы показать проблему. В консоли должен быть вывод (строка 24), но это не так. Если вы измените return forkJoin([setToHandle]); вернуть forkJoin(setToHandle); вы увидите вывод (строка 21). Но это должно работать и в этом случае return forkJoin([setToHandle]);

Vegas Rico 18.01.2023 10:00

См. обновление 2 выше.

DeborahK 18.01.2023 18:14

Большое спасибо, Дебора!!! Это действительно работает!

Vegas Rico 19.01.2023 17:42

Другие вопросы по теме