1

我有一个通过import-mapFooService加载的 Singleton-Class 。我想(a)等待它并在各种异步函数中使用它,如下所示:

declare global {
  interface Window {
    System: System.Module
  }
}

const module = window.System.import('@internal/foo-service')
const fooService = module.FooService

async function func1() {
  await fooService.doBar()
  .
  .
}

async function func2() {
  await fooService.doBar2()
  .
  .
}

但我只能让它像这样工作:

declare global {
  interface Window {
    System: System.Module
  }
}

async function getfooService() {
  const module = await window.System.import('@internal/foo-service')
  return module.FooService
}

function func1() {
  getfooService().then(fooService => fooService .doBar())
  .
  .
}

function func2() {
  getfooService().then(fooService => fooService.doBar2())
  .
  .
}

每次我想使用它时,如何在不重新加载它的情况下实现这一点?

4

2 回答 2

5

你的第一个猜测几乎没问题。请注意,module返回的 byimport是一个承诺,因此您需要将其用作

const fooService = window.System.import('@internal/foo-service').then(module =>
  module.FooService
);

async function func1() {
  (await fooService).doBar();
//^                ^
  …
}

async function func2() {
  (await fooService).doBar2();
//^                ^
  …
}

顺便说一句,我建议避免使用FooService“模块对象”(或更糟的是,class,而只是export命名函数,这样您就可以删除.then(module => module.FooService).

于 2021-01-04T10:43:58.553 回答
0

您可以尝试将其包装在 IIFE 中,如下所示:


declare global {
  interface Window {
    System: System.Module
  }
}

// Wrap rest of the code in IIFE
(async () => {
  const module = await window.System.import("@internal/foo-service");

  // Use await keyword if FooService/doBar/doBar2 are async
  const fooService = await module.FooService;
  const doBar = await fooService;
  const doBar2 = await fooService;

  async function func1() {
    doBar();
  }

  async function func2() {
    doBar2();
  }
})();
于 2020-12-31T07:23:11.897 回答