Обновление большого списка элементов с помощью await, как я могу это ускорить?

#angular #typescript

Вопрос:

Я обновляю большой список товаров и устанавливаю цены.

для…

 currentItem.attributes.menuItemPrice10 = currentItem.attributes.menuItemPrice1   .28;
await this.menuItemsService.save(currentItem);
 

Это работает нормально, но Angular, похоже, имеет ограниченные возможности потоковой передачи.

Если я отключу ожидание, то он просто взорвется в списке, но, проверяя журналы, он не обновляет все — так что похоже, что он отказывается от некоторых обновлений, потому что я этого не ждал, верно?

Итак, альтернативой, по — видимому, являются веб-работники, но в нем говорится, что это не поддерживает запуск «самого себя» в качестве веб-работника и имеет некоторые ограничения платформы. Не уверен, что это значит, поэтому ищу лучшие практики о том, как это ускорить?

Спасибо

Комментарии:

1. Вы подумали Promise.all , я на самом деле не уверен, сработает ли это, но я думаю, что сопоставление ваших товаров с обещаниями обновлений может сократить это…

2. Насколько велик этот список? Что делает функция сохранения? Вы показываете список в пользовательском интерфейсе или просто сохраняете его в БД или бэкэнде?

3. Обещаю.все — нет, не знал об этом, так что, глядя на это. Вероятно, ~2000 строк за запуск, да, внутренний микросервис сохраняется в БД, не показывая список во время его запуска.

Ответ №1:

Я предполагаю save , что это асинхронная операция, например, сетевой запрос. Если он действительно использует что-то подобное fs.writeFileSync , что блокирует весь процесс, то вы не сможете его ускорить.

Есть Обещание.все это позволяет вам ждать, пока множество Обещаний не будет выполнено. Объедините это с .map , и вы сможете выполнять массовые операции со списками элементов:

 await Promise.all(items.map(item => this.menuItemService.save(item)));
// or if it's just a hardcoded small amount of operations:
await Promise.all([
    this.menItemService.save(previousItem),
    this.menItemService.save(currentItem),
    this.menItemService.save(nextItem),
]);