假设我有一个 AMD 模块,它在某些环境中有条件地需要第二个模块:
定义([“要求”],功能(要求){ 变量 myObj = { 富:console.error.bind(控制台) }; 如果(浏览器环境) 要求([“./条件-polyfill”],函数(polyfill){ myObj.foo = console.log.bind(console,polyfill) ; }); 返回我的对象;//在满足条件要求之前返回 });
问题是:在条件要求完成后,如何延迟 define() 调用以返回/回调?
即下面的代码失败:
需要([“模块从上面”],函数(记录器){ logger.foo("你好!"); //console.error 被调用 });
我对解决这个问题的想法:
- 如果我 inline
./polyfill
,一切都会奏效。但是,这只是规避了问题,并不适用于所有情况。我希望它模块化是有原因的。 - 我可以返回一个Deferred对象,而不是稍后
myObj
实现。./conditional-polyfill
这会起作用,但是一直打电话真的很难看loggerDeferred.then(function(logger){ ... });
。 - 我可以为这个模块制作一个 AMD 加载器插件。一切准备就绪后立即调用回调。同样,这会起作用,但自己的加载器插件不适用于我的构建工具。
我能想到的所有解决方案都是黑客而不是好的代码。但是,我认为我的问题并不太牵强。那么,如何处理呢?