是否可以在EcmaScript模块中执行延迟导出(例如,在导入脚本中执行了一些异步操作之后)?
function do_export() {
export default class AsyncClass {
constructor() {
this.name = "Async Class";
}
}
}
setTimeout(do_export, 500);
最佳答案
并非如此,import
和export
都将一次性评估。以后再也不会调用导出。这样考虑:如果再次调用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);
})();