是否可以在EcmaScript模块中执行延迟导出(例如,在导入脚本中执行了一些异步操作之后)?

function do_export() {
    export default class AsyncClass {
        constructor() {
            this.name = "Async Class";
        }
    }
}

setTimeout(do_export, 500);

最佳答案

并非如此,importexport都将一次性评估。以后再也不会调用导出。这样考虑:如果再次调用do_export会发生什么?

但是import可以用作函数:

const promise = import("module-name");
const module_name = await promise;


这意味着您可以将模块的导入推迟到需要时再进行。

如您所愿,推迟出口的另一种方法是返回Promise,这是承诺的目的:

export default new Promise((resolve) => {
  setTimeout(()=>{
    class AsyncClass {
      constructor() {
        this.name = "Async Class";
      }
    }
    resolve(AsyncClass);
  }, 500);
});


现在,您可以立即导入模块,但必须等待程序中的值:

import AsyncClass from "./AsyncClass.js";


(async ()=>{
    const instance = new (await AsyncClass)();
    console.log(instance.name);
})();

08-08 05:10