Что такое Ember RunLoop и как он работает?
Я пытаюсь понять, как работает Ember RunLoop и что заставляет его тикать. Я посмотрел на документация, но все еще есть много вопросов об этом. Мне интересно лучше понять, как работает RunLoop, поэтому я могу выбрать подходящий метод в его пространстве имен, когда мне нужно отложить выполнение некоторого кода на более позднее время.
- когда начинается Ember RunLoop. Это зависит от маршрутизатора или представлений или контроллеров или чего-то еще еще?
- сколько времени это примерно занимает (Я знаю, что это довольно глупо спрашивать и зависеть от многих вещей, но я ищу общую идею, или, может быть, если есть минимальное или максимальное время, которое может занять runloop)
- выполняется ли RunLoop в любое время, или это просто указывает на период времени от начала до конца выполнения и может не выполняться в течение некоторого времени.
- если представление создается из одного RunLoop, гарантируется ли, что все его содержимое будет сделать это в DOM к моменту окончания цикла?
Простите меня, если это очень простые вопросы, я думаю, что понимание этого поможет нубам, таким как я, лучше использовать Эмбер.
1 ответ:
обновление 10/9/2013: проверьте эту интерактивную визуализацию цикла выполнения:https://machty.s3.amazonaws.com/ember-run-loop-visual/index.html
5/9/2013 обновления: все основные понятия ниже все еще актуальны, но по состоянию на этот коммит, реализация цикла запуска Ember была разделена на отдельную библиотеку под названием backburner.js, с некоторыми очень незначительными API различия.
во-первых, читать это:
http://blog.sproutcore.com/the-run-loop-part-1/
http://blog.sproutcore.com/the-run-loop-part-2/
они не на 100% точны для Ember, но основные концепции и мотивация RunLoop по-прежнему обычно применяются к Ember; отличаются только некоторые детали реализации. Но, на ваши вопросы:
когда начинается Ember RunLoop. Это зависит от маршрутизатора или представлений или контроллеров или чего-то еще?
все основные события пользователя (например, события клавиатуры, события мыши и т. д.) запустят цикл выполнения. Это гарантирует, что любые изменения, внесенные в связанные свойства захваченным событием (мышь/клавиатура/таймер/и т. д.), полностью распространяются по всей системе привязки данных Ember перед возвратом управления обратно в систему. Итак, перемещение мыши, нажатие клавиши, нажатие кнопки и т. д., все запускают прогон петля.
сколько времени это примерно занимает (Я знаю, что это довольно глупо спрашивать и зависеть от многих вещей, но я ищу общую идею, или, может быть, если есть минимальное или максимальное время, которое может занять runloop)
ни в коем случае RunLoop никогда не будет отслеживать, сколько времени требуется для распространения всех изменений через систему, а затем остановить RunLoop после достижения максимального срока; скорее, RunLoop всегда будет работать до завершения и не будет остановитесь, пока не будут вызваны все истекшие таймеры, не будут распространены привязки и, возможно,их привязки распространяются, и так далее. Очевидно, что чем больше изменений должно быть распространено из одного события, тем больше времени займет выполнение RunLoop. Вот (довольно несправедливый) пример того, как RunLoop может увязнуть с распространением изменений по сравнению с другой структурой (магистралью), которая не имеет цикла запуска:http://jsfiddle.net/jashkenas/CGSd5/ . Мораль история: RunLoop действительно быстр для большинства вещей, которые вы когда-либо хотели бы сделать в Ember, и именно там лежит большая часть власти Ember, но если вы обнаружите, что хотите анимировать 30 кругов с Javascript со скоростью 60 кадров в секунду, могут быть лучшие способы сделать это, чем полагаться на RunLoop Эмбера.
выполняется ли RunLoop все время, или это просто указывает на период времени от начала до конца выполнения и может не выполняться в течение некоторого времени.
это не выполняется в любое время-он должен вернуть управление обратно в систему в какой-то момент, иначе ваше приложение зависнет-это отличается, скажем, от цикла запуска на сервере, который имеет
while(true)и продолжается до бесконечности, пока сервер не получает сигнала на выключение... в Ember RunLoop такого нетwhile(true)но только вращается в ответ на события пользователя / таймера.если представление создается из одного RunLoop, гарантируется ли, что все его содержимое попадет в DOM к моменту цикла заканчивается?
посмотрим, сможем ли мы это выяснить. Одно из больших изменений от SC до Ember RunLoop заключается в том, что вместо циклического перехода между
invokeOnceиinvokeLast(который вы видите на диаграмме в первой ссылке о RL SproutCore), Ember предоставляет вам список "очередей", которые в ходе цикла выполнения вы можете запланировать действия (функции, которые будут вызваны во время цикла выполнения), указав, к какой очереди принадлежит действие (пример из источника:Ember.run.scheduleOnce('render', bindView, 'rerender');).если вы посмотрите на
run_loop.jsв исходном коде, вы видитеEmber.run.queues = ['sync', 'actions', 'destroy', 'timers'];, но если вы откроете свой отладчик JavaScript в браузере в приложении Ember и оценитеEmber.run.queues, вы получаете более полный список очередей:["sync", "actions", "render", "afterRender", "destroy", "timers"]. Ember сохраняет свою кодовую базу довольно модульной, и они позволяют вашему коду, а также его собственному коду в отдельной части библиотеки вставлять больше очередей. В этом случае библиотека Ember Views вставляетrenderиafterRenderочереди, особенно послеactionsочередь. Я разберусь, почему это может быть через секунду. Во-первых, алгоритм RunLoop:алгоритм RunLoop почти такой же, как описано в статьях цикла запуска SC выше:
- вы запускаете свой код между RunLoop
.begin()и.end(), только в уголек вы хотите, чтобы вместо того, чтобы запустить ваш код в тегиEmber.run, который будет внутренне вызыватьbeginиendдля вас. (Только внутренний код цикла выполнения в базе кода Ember по-прежнему используетbeginиend, так что вы должны просто придерживаться сEmber.run)- после
end()вызывается, RunLoop затем запускает передачу для распространения каждого изменения, внесенного куском кода, переданного
Comments