2015-01-29 3 views
3

В настоящее время у меня есть веб-приложение, которое использует как собственные диаграммы d3, так и диаграммы, используя модуль диаграммы c3.js.Как остановить D3.js от блокировки при возврате на страницу

Мои диаграммы обновляются каждые 1-2 секунды из-за изменения данных, и на экране могут быть 3-4 диаграммы в любой момент времени.

Я заметил, что если я изменяю вкладки в хроме или сворачиваю окно, когда я вернусь на вкладку, d3.js тратит время LONG в d3_timer_step, полностью блокируя пользовательский интерфейс на 5+ секунд (в зависимости от того, как если пользователь находится далеко от вкладки), это может существенно заблокировать пользовательский интерфейс в течение многих минут, если пользователь не работает в течение 30 минут или около того.

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

Очевидно, что я могу (и, вероятно, так или иначе) перестать обновлять свои диаграммы, когда окно не видно, однако мой вопрос в том, кто-нибудь еще нашел эту проблему и каково ее решение? например есть ли опция d3 для ограничения буфера анимации или аналогичного?

+0

Я бы опубликовал это на странице проблем проекта d3js Github (https://github.com/mbostock/d3/issues). Насколько я понял, анимации не должны ставиться в очередь, так как requestAnimationFrame должен быть неактивным или резко уменьшенным. – Bill

+0

@Bill, Спасибо, примечание о requestAnimationFrame отправило меня по правильному пути. Похоже, что, поскольку он приостановлен, переходы ожидают очереди, поэтому при возврате фокуса происходит огромное отставание переходов, из-за чего d3_timer_step занимает много времени, проходя через отставание. По-видимому, возможным решением является использование selection.interrupt для уменьшения количества переходов. Я также поднял вопрос, чтобы увидеть, есть ли что-то, что d3 может сделать внутренне, чтобы улучшить опыт. См. Https://github.com/mbostock/d3/issues/2211 –

+1

Возможно, проблема с 'c3'. Не могли бы вы поставить скрипку, которая воспроизводит вашу проблему? –

ответ

0

Я сторонник C3.

Я предполагаю, что вы используете действительно старую версию C3 (0.4.9); 0.4.11 исправляет это, я думаю, что произошла ошибка с data.load. Попробуйте обновить версии!

+0

Спасибо @aendrew, работает последняя версия. –

0

В моем случае 0.4.11 ничего не меняет (и даже chart.destroy() не делает ничего удивительного). Основная проблема - c3js продолжать планировать переходы d3, даже если они размыты и уничтожены в данный момент. D3 на своей стороне откладывает все переходы до тех пор, пока вкладка не будет сфокусирована, а затем BAM - выполнит все в одном запросе блокировки.

Если это так, вы можете изменить длительность перехода глобального графика на 0 или null. Большинство внутренних функций c3 полагаются на продолжительность перехода в качестве флага для выполнения перехода или нет (в случае 0).

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