Это должно возможно сделать вещи асинхронно в JavaScript (Ajax в стороне)? Например, для итерации нескольких массивов одновременно. Как это сделано? Краткий пример был бы хорош. Поиск этого был труден, из-за всего ajax загрязнения, которое не является тем, что я ищу.
Заранее спасибо.
Используйте веб-воркеров . Но помните, что это очень новая функция, и не все браузеры полностью поддерживаются.
JavaScript обычно однопоточный; вы не можете делать несколько вещей одновременно. Если ваш код JavaScript слишком медленный, вам нужно разгрузить работу. Новый способ - использовать web workers, как отметили другие. Старый способ - часто использовать AJAX и выполнять работу на сервере. (Либо с веб-рабочими, либо с AJAX, массивы должны быть сериализованы и результат десериализован)
. Вы можете использовать setTimeout
.
setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);
Я не уверен, насколько он будет параллельным, но это модель асинхронного программирования.
Одним из новых достижений в этой области является HTML5 Web Workers.
Как утверждает Грумдриг, вы можете написать такой код:
setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);
Но он все равно не будет выполняться параллельно. Вот общее представление о том, что происходит после вызова таких таймаутов:
setTimeout
будет выполняться немедленно, включая возвраты к вызывающим функциям. onclick
и onmousemove
, в этом случае функции, связанные с этими событиями, будут выполняться в ущерб точности таймера. Очевидно, что нет никакого преимущества в производительности при выполнении такого кода. В любом случае это приведет к тому, что все будет выполняться дольше. Однако в тех случаях, когда выполнение одной задачи занимает так много времени, что браузер зависает (и, возможно, выдает предупреждение браузера "Script is taking too long"), может быть полезно разбить ее на более мелкие, быстрее выполняющиеся части, которые запускаются последовательно через некоторое время задержки, давая браузеру время передохнуть.
Web Workers уже упоминались, и если вас не беспокоит совместимость с IE, вы можете использовать их для настоящего параллелизма. Однако существуют некоторые серьезные ограничения на их использование, наложенные из соображений безопасности. Например, они не могут каким-либо образом взаимодействовать с DOM, то есть любые изменения на странице должны выполняться синхронно. Кроме того, все данные, передаваемые рабочим и обратно, сериализуются при передаче, что означает, что настоящие объекты Javascript не могут быть использованы. Тем не менее, для интенсивной обработки данных Web Workers, вероятно, является лучшим решением, чем разбиение функции на несколько задач с задержкой по таймеру.