Я имею дело с (возможно) особой ситуацией и не знаю, как избежать (потенциальных) проблем параллелизма.
У меня угловой сервис с картой объектов (владельцев).Эти объекты обновляются - каждую секунду (через интервал (1000)) - здесь мне нужно перебрать все объекты и увеличить определенное свойство - в любое время, когда приходит уведомление о веб-сокете - тогда я получаю объект с карты и обновляю несколько свойств.(Обновление объектов будет иметь более высокий приоритет каждую секунду)
Так что мои вопросы будут такими:
- Есть ли проблема вообще - например, если я перебираюмассив при отправке уведомления через веб-сокет?(Я не уверен, что происходит ... Я никогда не видел какого-то исключения из параллелизма в Typescript / JavaScript.)
- Было бы хорошей идеей "объединить" эти 2 потока - например, с помощью mergeMap ()?
- Есть ли способ дать привилегию первому (второму) потоку?
- Будет ли иметь значение обработка частей в операторе tap ()?Я надеюсь, что внутри части крана копия массива выполняется асинхронно в фоновом режиме и по окончании фиксирует результат в функции обратного вызова подписки.
private tick(): void {
of(this.map, asap)
.pipe(tap((map: Map<number, Holder>) => Array
.from(map.values())
.filter((holder: Holder) => holder.isActive())
.forEach((holder: Holder) => holder.tick()))
)
.subscribe((map: Map<number, Holder>) => this._map$.next(Lodash.cloneDeep(map)));
}
private tick(): void {
Array.from(this.map.values())
.filter(holder => holder.isActive())
.forEach((holder: Holder) => holder.tick());
this._map$.next(Lodash.cloneDeep(this.map));
}
Любые намеки на то, каким может быть наиболее эффективный подход?
Итак, на самом деле мой вопрос: как бороться с несколькими событиями, влияющими на одну коллекцию - возможно, в одно и то же время?
простите за мой английский и заранее большое спасибо! Аксель