JavaScript:异步创建实例并在不同模块中使用

JavaScript:异步创建实例并在不同模块中使用,javascript,asynchronous,module,Javascript,Asynchronous,Module,我正在建立一个小的网络聊天。我用于聊天的服务要求我在前端创建一个客户端,然后我可以使用该客户端进行通信。代码如下所示: import Client from 'some-chat-service' async function connect() { const token = await getToken() // first need to get token from backend const client = await Client.create(token) //

我正在建立一个小的网络聊天。我用于聊天的服务要求我在前端创建一个客户端,然后我可以使用该客户端进行通信。代码如下所示:

import Client from 'some-chat-service'

async function connect() {
    const token = await getToken() // first need to get token from backend
    const client = await Client.create(token) // then we can create client instance
}
import Client from 'some-chat-service'

export let client;

async function connect() {
    const token = await getToken()
    client = await Client.create(token)
}
connect()
现在,问题是我不能在其他任何地方(不同的文件中)使用
客户机,因为它是在
connect
函数中声明的

解决方法如下所示:

import Client from 'some-chat-service'

async function connect() {
    const token = await getToken() // first need to get token from backend
    const client = await Client.create(token) // then we can create client instance
}
import Client from 'some-chat-service'

export let client;

async function connect() {
    const token = await getToken()
    client = await Client.create(token)
}
connect()
现在,我们可以在任何我们想要的地方使用客户端,但在我看来它非常奇怪


您知道如何处理此类问题吗?

您想在哪里呼叫
connect
?如果导入模块应该调用它,那么只需从函数中返回客户机,如果导出模块应该启动连接本身(如第二个代码段),那么您应该导出一个承诺:

export const clientPromise = getToken().then(Client.create);


在任何情况下,导入此功能的模块都需要等待初始化承诺。

问得好!我认为它应该自动连接,因为它可以在许多模块中使用。知道了!理想情况下,我应该返回客户端,然后执行,
export const client=connect()
?:)非常感谢。不,(没有)您不能立即导出异步创建的客户机,您只能为它导出承诺。这正是我想要做的(您的异步/等待示例)。非常感谢。