Javascript:有没有办法检测所有异步脚本何时加载?

时间:2015-09-03 18:55:56

标签: javascript asynchronous

如果在HTML页面上使用普通脚本标记,则在下载和解析脚本之前,将阻止呈现。为避免这种情况,为了加快页面显示速度,您可以添加“async'属性,告诉浏览器继续处理页面而不等待该脚本。但是,这固有意味着引用该脚本中任何内容的其他javascript可能会崩溃,因为它所需的对象尚未存在。

据我所知,没有allScriptsLoaded事件你可以绑定,所以我正在寻找模拟一个的方法。

我知道以下策略可以推迟运行其他代码,直到异步脚本可用:

  • 对于单个脚本,请使用他们的' onload'事件或属性。但是,如果不止一个脚本加载了所有脚本的话,我就没有内置的方法可以告诉你。
  • 在附加到窗口的onload事件处理程序中运行所有相关代码。但是,那些等待所有图像的人,不仅仅是所有脚本,所以运行时间要晚于理想状态。
  • 使用加载程序库加载所有脚本;那些通常提供回调以在所有内容都已加载时运行。下行(除了需要一个库来执行此操作,必须提前加载),所有代码都必须包含在一个(通常是匿名的)函数中,并传递给加载器库。这与仅创建一个在我的神秘的allScriptsLoaded激活时运行的函数相反。

我错过了什么,还是最先进的?

1 个答案:

答案 0 :(得分:0)

你可能希望的最好的方法是知道是否有任何未完成的异步调用(XMLHttpRequest,setTimeout,setInterval,SetImmediate,process.nextTick,Promise),并等待那里不是一个。但是,这是底层本机代码丢失的实现细节 - javascript只有自己的事件循环,如果我理解正确,异步调用将传递给本机代码。最重要的是,您无权访问事件循环。您只能插入,无法读取或控制流程(除非您在io.js和feeling frisky中)。

模拟一个的方法是自己跟踪脚本调用,并在所有脚本完成后调用。 (即,每次将相关脚本插入事件循环时进行跟踪。)

但是,DOM没有提供NoAsyncPending全局或其他东西,这是你真正需要的。