Как утверждает Grumdrig, вы можете написать код, подобный этому:
setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);
Но он все равно не будет работать одновременно. Вот общее представление о том, что происходит после того, как такие тайм-ауты называются:
- Любой код после
setTimeout
вызовов будет запущен немедленно, включая возврат к вызывающим функциям.
- Если в очереди есть другие таймеры, которые имеют задержку или интервал времени или превышают их, они будут выполняться по одному за раз.
- Пока работает любой таймер, другой может нажать на интервал / время задержки, но он не будет работать до тех пор, пока не закончится последний.
- Некоторые браузеры отдают приоритет событиям, инициируемым от взаимодействия с пользователем, таким как
onclick
и onmousemove
, и в этом случае функции, связанные с этими событиями, будут выполняться за счет точности таймера.
- Это будет продолжаться до тех пор, пока не произойдет открытие (ранее не вызывавшиеся таймеры или обработчики событий, запрашивающие выполнение). Только тогда будут выполняться функции в примере кода. Опять по одному, первое вероятно, но не обязательно выполняется первым. Кроме того, я рискну предположить, что некоторые браузеры могут устанавливать минимальное время задержки, что приведет к запуску любых таймеров с задержкой 0 миллисекунд даже позже, чем ожидалось.
Очевидно, что при запуске такого кода нет никакого преимущества в производительности. В любом случае это займет больше времени. Однако в тех случаях, когда одна задача занимает так много времени, она замораживает браузер (и, возможно, отключает «браузер требует слишком много времени» предупреждений браузера), может быть полезно разбить ее на более мелкие, быстрее выполняющиеся фрагменты, которые запускаются последовательно после некоторого времени задержки , таким образом, давая браузеру время дышать.
Web Workers уже упоминались, и если вас не беспокоит совместимость с IE, вы можете использовать их для истинного параллелизма. Однако существуют некоторые серьезные ограничения на их использование, наложенные по соображениям безопасности. Для одного они не могут взаимодействовать с DOM каким-либо образом, означая, что любые изменения на странице все равно должны выполняться синхронно. Также все данные, передаваемые рабочим и от них, сериализуются при передаче, что означает, что настоящие объекты Javascript не могут быть использованы. При этом для интенсивной обработки данных веб-работники, вероятно, являются лучшим решением, чем разбивка функций на несколько задач с задержкой по таймеру.