2013-07-03 2 views
1

Моя компания переходит от классического синтаксиса Dojo к AMD. У нас есть несколько ситуаций, когда нам нужно динамически загружать модули синхронно.Доджо требует синхронного единственного аргумента?

Требование в додзё, похоже, официально не поддерживает синхронную загрузку (по крайней мере, это не документировано нигде), но, похоже, это работает, если вы не передадите функцию a в качестве второго аргумента (в 1.7.2 по крайней мере).

require(["path/to/my/Module"]); 

Я добавил дополнительную задержку в Fiddler, и это определенно загружается, прежде чем переходить на следующую строку.

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

ответ

1

AMD не поддерживает синхронную загрузку даже при использовании стиля commonJs. Функция require будет загружаться только синхронно, если модуль уже загружен. См:

Если вы уже загрузили модуль асинхронно, то можно использовать CommonJS стиль требует, например:

var lang = require("dojo/_base/lang"); 

Однако, если вы еще не загрузили его, он будет вызывать ошибку undefinedModule (у меня есть teste t это в v1.9). Если это работает в v1.7, то это было исправлено в более поздних изданиях Dojo.

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

require({"async":false}); 

Установка асинхронной может быть установлен только во время загрузки (см: http://dojotoolkit.org/reference-guide/1.9/loader/amd.html#loader-amd-configuration). Следовательно, вы выбираете асинхронный или синхронный при начальной нагрузке, а затем вы застреваете там.

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

+0

От взгляда на API AMD Я думаю, что это может быть ошибкой на стороне Додзе. Синтаксис Я использую не требуется (строка) или требуют (массив, функция) это требуется (массив) модуль определенно не был загружен еще потому, что я звоню его в блоке где я специально не требую его заранее. Он загружается синхронно, потому что я использовал fiddler для увеличения латентности вызова в течение 2000 мс, и он ждал его загрузки. –

+0

Я попытался воспроизвести это, но не смог сделать это (используя оба v1.9 и v.1.7.2). Я использовал формат массива (без обратного вызова), как вы это делали, но он по-прежнему загружается асинхронно. Возможно, вы используете разные настройки? У меня есть {cacheBust: true, async: true} - пробовали с локальным Dojo и с помощью Google CDN. Даже если он работает синхронно, я бы предположил, что это будет в будущем и случайном переключении времени на асинхронное - т.е. вероятно, использует неизвестный недостаток в загрузчике. Я не эксперт по загрузчику Dojo, поэтому я не могу точно сказать, правильно это или нет. –

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