Предположим, у меня есть модуль AMD, которому условно требуется второй модуль в некоторых средах:
define(["require"], function(require) { var myObj = { foo: console.error.bind(console) }; if(browserEnv) require(["./conditional-polyfill"],function(polyfill){ myObj.foo = console.log.bind(console,polyfill) ; }); return myObj; //returns before conditional require is satisfied });
Возникает вопрос: как я могу отложить возврат / обратный вызов метода define () ПОСЛЕ выполнения условного требования?
Т.е. приведенный ниже код не работает:
require(["module-from-above"],function(logger){ logger.foo("Hello!"); //console.error gets called });
Мои мысли по поводу решения этой проблемы:
- Если я вставлю
./polyfill
, все будет работать. Однако это просто обходит проблему и работает не во всех случаях. Я хочу сделать его модульным по какой-то причине. - Я мог бы вернуть объект Deferred вместо
myObj
, который будет выполнен./conditional-polyfill
позже. Это сработает, но действительно некрасиво звонитьloggerDeferred.then(function(logger){ ... });
все время. - Я мог бы сделать плагин загрузчика AMD для этого модуля. И перезвоните, как только все будет готово. Опять же, это сработает, но плагины собственного загрузчика не работают с моим инструментом сборки.
Все решения, которые я могу придумать, - это скорее хаки, чем хороший код. Однако я думаю, что моя проблема не слишком надуманная. Итак, как с этим справиться?