2016-02-04 3 views
0

Предположим, у меня есть большое количество данных для обработки. Для этого примера предположим, что данные просто не могут быть обработаны на стороне сервера; он должен обрабатываться на стороне клиента. Предположим также, что весь процесс данных выглядит следующим образом:Написание неблокирующих функций DOM

for element in data do: 
    //do some work with "element" 
end 

Опять же, ради этого примера, давайте предположим, что data содержит 100.000 элементов.

Вызов функции процесса заморозит всю DOM до тех пор, пока цикл не достигнет конца. Мой вопрос: есть ли способ сделать эту обработку неблокирующим способом? Будь то какой-то асинхронный/ожидающий, обрабатывающий куски data с каким-то типом механизма yield или почти что-нибудь еще?

EDIT: веб-работники не являются вариантом, так как мне нужна поддержка IE 11.

EDIT 2: Кажется, я смешивал «Web Workers» с «Shared Web Workers». Ответ на вопрос.

+6

Вы изучали WebWorkers для этой цели? https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers – johnnyutah

+0

@johnnyutah - У них не будет доступа к DOM. – Quentin

+0

@Quentin так? ........ – zerkms

ответ

1

Вы можете просто запрограммировать определенное количество элементов каждый раз, обрабатывая следующую партию в следующем стеке. Для этого вы должны использовать setTimeout. Это довольно рудиментарным, но работает в любом браузере .. Может быть, используя уменьшить или что-то .. отправка остальное на следующий стек и так далее ..

Эта статья может помочь https://benjaminhorn.io/code/part-2-cpu-intensive-javascript-computations-without-blocking-the-single-thread/

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

Смежные вопросы