javascript - 在 JavaScript 中异步加载外部脚本

标签 javascript design-patterns

这是我用 JS 编写的第一个模块,我想确保我做对了。 这将是一个简单的画廊模块,但我希望它也能够显示 youtube 和 vimeo 电影。 在我的模块中,我有一个名为 init() 的函数。在我首先展示画廊之前,我想添加所有必要的库,比如 youtube iframe api 和 vimeo js api。 只有在它们加载后我才想显示画廊。 所以我的模块看起来像这样:

myModule = {};
myModule.isYoutubeApiLoaded = false;
myModule.isVimeoApiLoaded = false;
myModule.controller;
myModule.init = function (){
   myModule.loadYoutubeapi();
   myModule.loadVimeoApi();
   myModule.startController();
}

现在 startController 函数如下所示:

myModule.startController  = function (){
   myModule.controller = setInterval(function(
       if (myModule.isYoutubeApiLoaded && myModule.isVimeoApiLoaded ) {
             myModule.buildGallery();
             clearInterval(myModule.controller);
        }
   ), 5);
}

在 loadYoutubeapi() 和 loadVimeoApi() 中,我在加载脚本时设置给定的标志。 这是一个好方法吗?

最佳答案

不,这不是一个好方法。它会加载 CPU,并且可能会有不必要的 5 毫秒延迟。

更好的方法是向 loadYoutubeapi() 和 loadVimeoApi() 添加回调。一旦他们完成,他们必须调用您的新函数(例如 moduleHasLoaded()),该函数将计算加载的模块。加载完所有内容后,您可以调用 startController()。

它将节省 CPU,并且根本不会有不必要的延迟。

像这样:

myModule = {};
myModule.isYoutubeApiLoaded = false;
myModule.isVimeoApiLoaded = false;
myModule.loaded = false;
myModule.controller;

myModule.loadYoutubeapi = function() {

    /* Do your stuff. */

    myModule.isYoutubeApiLoaded = true;

    myModule.moduleHasLoaded();
}

myModule.loadVimeoApi = function() {

    /* Do your stuff. */

    myModule.isVimeoApiLoaded = true;

    myModule.moduleHasLoaded();
}

myModule.moduleHasLoaded = function() {

    if (!loaded && myModule.isYoutubeApiLoaded && myModule.isVimeoApiLoaded ) {
        loaded = true;
        myModule.buildGallery();
    }

}

myModule.init = function (){
    myModule.loadYoutubeapi();
    myModule.loadVimeoApi();
}

关于javascript - 在 JavaScript 中异步加载外部脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18715370/

相关文章:

javascript - AWS JS SDK、IAM 和 DynamoDB 问题

C#,读/写分离和属性。需要图案

java - 这是糟糕的 OO 编程吗?通过方法传递下来

javascript - 用于限制浏览器窗口大小的 css 或 javascript 选项

javascript - 恢复插件JS

javascript - 为什么我的新闻通讯表单在 Amazon CloudFront 上不起作用?

c# - 工厂类不支持 SOLID 原则

java - PatternLayout (log4j) 的 C、F、L、l 和 M 到底有多慢?

c# - 单个模块化组件应该与其他组件一起工作(组件=模块)

javascript - 如何使用 Angular JS 和 Bootstrap 实现表单验证?