Асинхронное программирование в JavaScript (НЕ Ajax)

Это должно возможно сделать вещи асинхронно в JavaScript (Ajax в стороне)? Например, для итерации нескольких массивов одновременно. Как это сделано? Краткий пример был бы хорош. Поиск этого был труден, из-за всего ajax загрязнения, которое не является тем, что я ищу.

Заранее спасибо.

8
задан aepheus 20 July 2010 в 20:55
поделиться

5 ответов

Используйте веб-воркеров . Но помните, что это очень новая функция, и не все браузеры полностью поддерживаются.

9
ответ дан 5 December 2019 в 07:10
поделиться

JavaScript обычно однопоточный; вы не можете делать несколько вещей одновременно. Если ваш код JavaScript слишком медленный, вам нужно разгрузить работу. Новый способ - использовать web workers, как отметили другие. Старый способ - часто использовать AJAX и выполнять работу на сервере. (Либо с веб-рабочими, либо с AJAX, массивы должны быть сериализованы и результат десериализован)

.
1
ответ дан 5 December 2019 в 07:10
поделиться

Вы можете использовать setTimeout .

setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);

Я не уверен, насколько он будет параллельным, но это модель асинхронного программирования.

6
ответ дан 5 December 2019 в 07:10
поделиться

Одним из новых достижений в этой области является HTML5 Web Workers.

2
ответ дан 5 December 2019 в 07:10
поделиться

Как утверждает Грумдриг, вы можете написать такой код:

setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);

Но он все равно не будет выполняться параллельно. Вот общее представление о том, что происходит после вызова таких таймаутов:

  • Любой код после вызова setTimeout будет выполняться немедленно, включая возвраты к вызывающим функциям.
  • Если в очереди есть другие таймеры, которые находятся в момент или по истечении времени задержки или интервала, они будут выполняться по очереди.
  • Пока работает один таймер, другой может достигнуть своего интервала/времени задержки, но он не будет запущен, пока не завершится последний.
  • Некоторые браузеры отдают приоритет событиям, запускаемым при взаимодействии с пользователем, таким как onclick и onmousemove, в этом случае функции, связанные с этими событиями, будут выполняться в ущерб точности таймера.
  • Это будет продолжаться до тех пор, пока не произойдет открытие (нет ранее вызванных таймеров или обработчиков событий, запрашивающих выполнение). Только после этого будут запущены функции из примера кода. Опять же по одной за раз, причем первая, скорее всего, но не наверняка, будет выполняться первой. Кроме того, я рискну предположить, что некоторые браузеры могут устанавливать минимальное время задержки, что заставит любые таймеры, установленные с задержкой в 0 миллисекунд, выполняться даже позже, чем ожидалось.

Очевидно, что нет никакого преимущества в производительности при выполнении такого кода. В любом случае это приведет к тому, что все будет выполняться дольше. Однако в тех случаях, когда выполнение одной задачи занимает так много времени, что браузер зависает (и, возможно, выдает предупреждение браузера "Script is taking too long"), может быть полезно разбить ее на более мелкие, быстрее выполняющиеся части, которые запускаются последовательно через некоторое время задержки, давая браузеру время передохнуть.

Web Workers уже упоминались, и если вас не беспокоит совместимость с IE, вы можете использовать их для настоящего параллелизма. Однако существуют некоторые серьезные ограничения на их использование, наложенные из соображений безопасности. Например, они не могут каким-либо образом взаимодействовать с DOM, то есть любые изменения на странице должны выполняться синхронно. Кроме того, все данные, передаваемые рабочим и обратно, сериализуются при передаче, что означает, что настоящие объекты Javascript не могут быть использованы. Тем не менее, для интенсивной обработки данных Web Workers, вероятно, является лучшим решением, чем разбиение функции на несколько задач с задержкой по таймеру.

4
ответ дан 5 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: