微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

延迟加载脚本直到 promise 完成

如何解决延迟加载脚本直到 promise 完成

有没有办法延迟脚本标签的 onload 事件,直到脚本中的某个 Promise 完成?

一点背景知识:我加载了一个具有以下功能的脚本。在脚本内部调用了一些异步函数,该函数返回一个值。

const loadScript = (src,resolveWithGlobal) =>
  new Promise((resolve) => {
    const script = window.document.createElement("script");
    script.src = src;
    script.async = true;
    script.onload = () => {
      resolve(window[resolveWithGlobal]);
    };

    window.document.body.appendChild(script);
});

const lib = await loadScript("path/to/library1.js","library2");

并且加载的脚本看起来与此类似(它的行为类似于加载其他脚本/库的代理)

// library1.js
(async () => {
   await loadScript("path/to/library2.js","library2");
})();

目前我只是返回是在同一个文件中查找并执行两个 loadScript 调用,如果我以后想删除间接引用,这有点难看

const lib1 = loadScript("lib1.js","lib1");
const lib = loadScript(lib.path,"lib2");

解决方法

对于一般情况,您可以将解析器函数放在窗口上,使用一些不会与任何其他名称冲突的名称 - 可能将一个随机字符串放入脚本标记的数据集中。然后让脚本在运行时检查其脚本标记的唯一名称并在其异步操作完成后调用解析器..

const loadScript = (src,resolveWithGlobal) =>
    new Promise((resolve) => {
        const script = window.document.createElement("script");
        script.src = src;
        script.async = true;
        const uniqueId = Math.random().toString(36).substring(7);
        script.dataset.uniqueId = uniqueId;
        window[uniqueId] = () => {
            delete window[uniqueId]
            return () => {
                resolve(window[resolveWithGlobal]);
            };
        };
        script.onload = () => {
            // If resolver hasn't been retrieved by the library,do it now:
            window[uniqueId]?.()();
        };

        window.document.body.appendChild(script);
    });
const lib1 = loadScript("lib1.js","lib1");
// lib1.js
const resolve = window[document.currentScript.uniqueid]();
loadScript("path/to/library2.js","library2")
  .then(resolve);

如果脚本不执行任何异步操作,则不需要对窗口上的解析器执行任何特殊操作 - loadScript 将改为调用它,在这种情况下,当脚本加载时.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?