Ответ 1
"Отложенные/обещания и веб-работники удовлетворяют различные потребности:
Отложено/обещание - это конструкции для назначения ссылки на результат, который еще не доступен, и для организации кода, который запускается, когда результат становится доступным или возвращается ошибка.
Веб-работники выполняют фактическую работу асинхронно (используя потоки операционной системы, а не процессы - поэтому они относительно легки).
Другими словами, поскольку JavaScript является однопоточным, вы не можете использовать отложенные/обещания для асинхронного выполнения кода - после запуска кода, который выполняет обещание, никакой другой код не запустится (вы можете изменить порядок выполнения, например, с помощью setTimeout()
, но это не делает ваше веб-приложение более отзывчивым). Тем не менее, вы можете каким-то образом создать иллюзию асинхронного запроса, например, перебирая массив значений, увеличивая индекс каждые несколько миллисекунд (например, используя setInterval), но это вряд ли практично.
Чтобы выполнять такую работу, как ваш запрос, асинхронно и, следовательно, не загружать эту работу из пользовательского интерфейса вашего приложения, вам нужно что-то, что действительно работает асинхронно. Я вижу несколько вариантов:
используйте IndexedDB, который предоставляет асинхронный API,
запустите собственную структуру данных в памяти и используйте веб-работников, как вы указали, для выполнения фактического запроса,
используйте серверный скрипт-движок, такой как NodeJS, чтобы запустить ваш код, затем используйте клиентский ajax, чтобы запустить запрос (плюс обещание обработать результаты),
использовать базу данных, доступную по HTTP (например, Redis, CouchDB), и от клиента выполнить асинхронный GET (например, ajax) для запроса к БД (плюс обещание обработать результаты),
разработать гибридное веб-приложение, используя, например, Анализировать.
Какой подход является лучшим в вашем случае? Трудно сказать без точных требований, но вот размеры, на которые я бы посмотрел:
- Сложность кода - если у вас уже есть код для вашей структуры данных, вероятно, веб-работники хорошо подойдут, в противном случае IndexedDB выглядит более разумным.
- Производительность - если вам нужна постоянная производительность, реализация на стороне сервера или БД кажутся более подходящими
- Архитектура/сложность - хотите ли вы, чтобы вся обработка выполнялась на стороне клиента, или вы можете позволить себе приложить усилия (затраты) для управления реализацией на стороне сервера?
Я нашел эту книгу полезной для чтения.