当前位置: 首页 > 知识库问答 >
问题:

创建动态异步屏障

季博
2023-03-14

假设代码块按需加载模块,如下所示:

  let tbls = document.querySelectorAll("div.magic-table");
  if(tbls) {
    import('./magic-table.js')
      .then(module => {
        L.magictables = module.magictables;
        tbls.forEach(o => {
          L.magictables.init(o);
        });
      })
      .catch(err => {
        console.error("Unable to load magic-table.js: " + err.message);
      });
  }

想象一下,序列中有几个这样的人;它们在搜索什么标记/类、加载什么模块以及初始化过程中的一些额外步骤方面有所不同,但总体上它们是相同的,并且是独立的。

现在假设您需要引入一个可能依赖于其他模块的新块。i. e.

  • 加载模块魔术表。js如果存在div.magic-table
  • 加载模块魔法表单。js如果存在div.magic-form
  • 加载模块魔术段落。如果p.magic在场,则为js
  • 加载模块魔术锚。js如果存在a.magic:
    • 但在执行此操作之前,请等待:
      • 加载和初始化的魔法表单(如果使用)
      • 加载和初始化的magic para(如果使用)

      我对javascript知之甚少,对异步javascript几乎一无所知,所以我不知道如何做到这一点。我想象的是这样的:

      在任何模块加载块之前,创建一个名为promises的数组。每次激活作为依赖项的模块时,它都会创建一个promise,并将其添加到promise列表中。一旦该模块完成,它就会“触发”promise(我不知道如何做到这一点,但在概念上):

        let tbls = document.querySelectorAll("div.magic-table");
        if(tbls) {
          let promise = new MyMagicPromise();
          promises.push(promise);
          import('./magic-table.js')
            .then(module => {
              L.magictables = module.magictables;
              tbls.forEach(o => {
                L.magictables.init(o);
              });
              promise.trigger();
            })
        }
      

      就在依赖于其他可选模块的模块之前,这样做是为了创建一个屏障,所有之前的模块都必须完成初始化:

      promises.forEach(p => {
         await p;
      });
      

      是否已经有一些现成的机制可以在javascript中实现这一点?如果不是的话,我的想象会起作用吗?

      我无法将依赖模块加载到另一个块的then(),因为依赖块可能依赖于多个其他模块(如果使用)。

      还有:纯javascript;没有框架

共有1个答案

刘瑞
2023-03-14

我真的不明白你。。。但我想我知道你想要什么。您使外部函数异步

(async () => {

let module1 = (await import("...")).default

let module2 = (await import("...")).default



})()

这实际上是使用async按顺序导入模块的基本方法

 类似资料:
  • 我已经尝试阅读了异步方法,现在正尝试创建自己的异步方法。该方法是返回错误日志列表的webservice调用。我不确定我是否理解正确,所以我想我应该分享我的代码,看看我是否应该做些不同的事情。 所有我想要的代码做的是返回一个错误日志列表通过调用方法GetAllErrorLogs(),这是一个同步的方法。因为获取所有错误日志可能需要一秒钟的时间,所以我希望在调用GetAllErrorLogs()方法后

  • 问题内容: 你好,我有这个设置 我需要为每个按钮获取以下内容 在Java中是否可以为我声明的每个按钮动态创建此按钮?因为当我有5个按钮时,我不需要3x5 = 15行代码,而是只有几行具有动态创建的按钮。 问题答案: 编写一个小循环并将您的按钮存储在数组中:

  • 你好,我已经准备好了 我需要为每个按钮获得以下内容 在Java中,是否可以为我声明的每个按钮动态创建它?因为当我有5个按钮时,我不希望3x5=15行代码,而只希望有几行动态创建的按钮。

  • 问题内容: 给定一个类名,我想动态创建一个Groovy类,向其添加属性和方法。我使用创建新类 对于我使用的方法 其中it.key是字符串(方法名),it.value是闭包。这很方便,因为我可以指定方法参数类型并进行类型检查。但是,如果不给它赋值,就无法指定动态创建的属性类型。我可以通过显式定义属性的getter和setter来解决此问题。这可行,但是metaClass.name = value或m

  • 问题内容: 我在mysql上创建数据库。首先创建主体表,每个表平均有30列。日志表的标准是引用表的pk加上每列*2。像这样: 参考表: 日志表: 现在,我想要创建一个过程,在该过程中,我将表名作为参数传递,并生成表日志查询并执行它。 做这个的最好方式是什么? 问题答案: 为了使一个字符串代表一个表(或数据库)名称,您将需要用变量连接查询字符串,并在存储过程中准备/执行一条语句。这是一个基本示例。

  • 问题内容: 我陷入GWT CellTable的问题。我需要动态创建单元表,而我没有实体(Bean)类。我已经看到了所有celltable的示例,并且在没有实体类的情况下进行了大量搜索。 我需要根据数据库中存储的一些元数据动态填充表。我可以创建表结构 考虑有两个类,一个是GRID,另一个是COLUMN,用于元数据和列定义。GRID将具有COLUMNS的列表作为列定义 现在,我需要从数据库中获取网格并