加载外部JavaScript文件,其中A要求异步加载B.

时间:2013-07-09 17:25:57

标签: javascript load external appendchild

我有一个用例,我有一个延迟加载的JS文件。在开发过程中,这个JS文件将是文件A和文件B的组合。但是在生产中它应该加载文件A然后加载文件B进行分离。 使用

将它们直接添加到DOM时,这可以正常工作
for(int i =0; i < urls.length; i++) {
    document.write("<script type='text/javascript' src='" + urls[i] + "'></script>");
}

即使FileB在FileA之前加载,也不会首先评估它。

我的代码如下

createScript: function(url, id) {
    var m = this;
    // flag as loaded
    var myonload = function() {
        Logger.debug(formatMessage(Library.RESOURCES["load.success"], [this.src, id]), "core");
        this.library_loaded = true;
    };

    // log loading error
    var myonerror = function() {
        Logger.warn(formatMessage(Library.RESOURCES["load.failure"], [this.src, id]), "core");
    };

    //If currently being grabbed
    // || m.currentAsyc[ids[i]+"/async"]
    if (Library.findScript(url))
        return;
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.library_loaded = false;

    // mozilla
    script.onload = myonload;
    script.onerror = myonerror;
    // ie
    script.onreadystatechange = function() {
        if (this.readyState == "complete" || this.readyState == "loaded") {
            setTimeout(myonload.bindAsEventListener(this), 10);
            this.onreadystatechange = null;
        }
    };

    script.src = url;
    m.head.appendChild(script);         

},

这导致DOM具有

<script type="text/javascript" src="/path/to/FileA"></script>
<script type="text/javascript" src="/path/to/FileB"></script>

但是当FileB加载得更快,然后FileA首先尝试评估自己。 有什么方法可以防止这种情况吗?

进一步解释

我正在尝试将类似Sprockets的功能实现到遗留系统中。 当我通常要求'/ dyn / path / to / FileA'时,它会有 // =要求顶部的FileB发送

的响应
document.write("<script type="text/javascript" src="/path/to/FileA"></script>");
document.write("<script type="text/javascript" src="/path/to/FileB"></script>");

这很有效,因为它同步进行调用。 在这种情况下,我进行了一次AJAX调用,以查看动态FileA需要哪些文件(那些文件是FileA和FileB)。这返回说我们需要请求FileA和FileB。问题是我需要回调以确认何时实际加载了这两个文件,因为我对其他需要此代码的区域也有等待功能。他们目前正在等待/ dyn / path / to / FileA完成加载,但我们现在需要他们等待FileA和FileB完成加载。

0 个答案:

没有答案