gpt4 book ai didi

javascript - promise 完成后导出

转载 作者:行者123 更新时间:2023-11-30 14:45:00 25 4
gpt4 key购买 nike

我想导出一个类,其初始状态取决于从另一个我无法修改的模块中的 Promise 返回的值。

代码如下:

let e = true;

APromiseFromAnotherModule()
.then(value => return value;);

export default class E {
constructor() {
if (e) {
//...
} else {
//...
}
}
}

我还尝试使用 async/awaitPromise 封装到一个异步函数中,如下所示:

let e = true;

getInitialValue = async () => {
return await APromiseFromAnotherModule()
.then(value => e = value;);
};

e = getInitialValue();

export default class E {
constructor() {
if (e) {
//...
} else {
//...
}
}
}

但这没有意义,因为它是一个 async 函数,所以显然它不起作用。

我错过了什么?

最佳答案

模块导出是同步完成的。因此,它们不能依赖于异步操作的结果。

而且,await 只在函数内部起作用。它实际上不会阻塞包含函数(包含函数返回一个 promise ),因此也不会帮助您将异步操作转换为同步操作。

处理在其设置中使用一些异步代码的模块的通常方法是导出一个 promise 并让调用代码在 promise 上使用 .then() 或初始化模块带有返回 promise 的构造函数。

该代码只是伪代码,因此很难准确判断您真正的问题是什么,以便向您展示适合您情况的具体代码。

举个例子。如果您想导出一个 class 定义,但不希望在某些异步代码完成之前使用该类定义,您可以这样做:

// do async initialization and keep promise
let e;
const p = APromiseFromAnotherModule().then(val => e = val);

class E {
constructor() {
if (e) {
//...
} else {
//...
}
}
};

// export constructor function
export default function() {
return p.then(e => {
// after async initialization is done, resolve with class E
return E;
});
}

然后调用者可以像这样使用它:

import init from 'myModule';
init().then(E => {
// put code here that uses E
}).catch(err => {
console.log(err);
// handle error here
});

这解决了几个问题:

  1. 异步初始化在模块加载后立即开始。
  2. 在异步初始化完成之前,类 E 对调用者不可用,因此在准备就绪之前不能使用它
  3. 模块的所有用户都使用相同的类E
  4. 异步初始化被缓存,所以只做一次

2023 年编辑 使用 ESM 模块时的现代 nodejs 版本具有顶级 await,因此可以在您之前 await 异步结果导出。

关于javascript - promise 完成后导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com