假设我有一个 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 加载器插件。一切准备就绪后立即调用回调。同样,这会起作用,但自己的加载器插件不适用于我的构建工具。
我能想到的所有解决方案都是黑客而不是好的代码。但是,我认为我的问题并不太牵强。那么,如何处理呢?