2014-09-12 2 views
0

Я должен разбирать очень большой массив JSON в Javascipt. Это выглядит следующим образом:Разбор большого массива JSON в Javascript

mydata = [ 
    {'a':5, 'b':7, ... }, 
    {'a':2, 'b':3, ... }, 
    . 
    . 
    . 
    ] 

Теперь вещь, если я прохожу весь этот объект моего разбора функции parseJSON(), то, конечно, работает, но он блокирует процесс этой вкладки на 30-40 секунд (в случае массив с 160000 объектами).

В течение всего этого процесса запроса этого JSON с сервера и его разбора я показываю пользователю «загрузку» gif. Конечно, после того, как я вызываю функцию синтаксического анализа, gif также замерзает, что приводит к плохой работе с пользователем. Я думаю, что в этот раз не обойтись, есть способ как-нибудь (по крайней мере) сохранить загрузку gif от замораживания?

Что-то вроде вызова parseJSON() на кусках моего JSON каждые несколько миллисекунд? Я не могу реализовать это, хотя являюсь noob в javascript.

Большое спасибо, я бы очень признателен, если вы могли бы помочь мне здесь.

+3

160 000 объектов действительно много. Вы должны разделить его на стороне сервера – Pinoniq

+0

Вы проверили эту тему? http://stackoverflow.com/questions/1160137/execute-background-task-in-javascript –

+0

Примените разбивку на страницы на стороне сервера, добавьте номера страниц и следующую страницу и т. д. в json, а затем продолжайте называть api для успеха ajax. –

ответ

1

Возможно, вы захотите проверить this link. Речь идет о многопоточности.

В основном:

var url = 'http://bigcontentprovider.com/hugejsonfile'; 

var f = '(function() { 
      send = function(e) { 
       postMessage(e); 
       self.close(); 
      }; 
      importScripts("' + url + '?format=json&callback=send"); 
     })();'; 

var _blob = new Blob([f], { type: 'text/javascript' }); 

_worker = new Worker(window.URL.createObjectURL(_blob)); 
_worker.onmessage = function(e) { 
    //Do what you want with your JSON 
} 
_worker.postMessage(); 

Не пробовал себя быть честным ...

EDIT о переносимости: Себастьен Д. оставил комментарий с a link to mdn. Я просто добавил ссылку на идентификатор раздела совместимости.

+0

Это действительно хорошее предложение, но, возможно, вы можете немного расширить его и добавить некоторые предупреждения о переносимости? – nepeo

+0

Мне недостаточно на эту тему, чтобы иметь возможность расширять слишком много. Однако я переписал ссылку с совместимостью с браузером. –

+0

Я, честно говоря, даже не слышал об этой функции, пока вы ее не разместили! Это довольно захватывающая апи. Учитывая, что я в основном работаю на мобильных устройствах, отсутствие поддержки андроида удручает, думаю, что это будет некоторое время, прежде чем я смогу попробовать это ... – nepeo

1

Я никогда не сталкивался с полной блокировкой страницы на 30-40 секунд, меня почти впечатлило! Настоящий ответ реструктурирует ваши данные намного меньше или разделяет их на многие файлы на стороне сервера. Вам действительно нужен каждый маленький байт данных?

В качестве альтернативы, если вы не можете изменить файл @ Ответ Cyrill_DD рабочего потока будет способен анализировать данные для вас и отправлять их на ваш основной JS. Это не идеальное решение, как вы предполагали. Передача данных между двумя потоками требует, чтобы информация была сериализована и переинтерпретирована, поэтому вы могли бы значительно замедлить, когда данные будут передаваться между потоками и снова вернуться к квадрату, если вы попытаетесь передать все данные за один раз. Построение системы запросов в рабочий поток для запроса фрагментов данных, когда они вам понадобятся, и использование обратного вызова сообщения предотвратит замедление от синтаксического анализа основного потока и позволит вам получить полный доступ к данным, не загружая все это в ваш основной контекст.

Я должен добавить, что рабочие потоки относительно новые, основная поддержка браузера хороша, но мобильный ужасен ... просто голова!

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