javascript - JS : Call async function before exporting something

标签 javascript asynchronous async-await es6-modules ecmascript-next

我需要调用一个异步函数来获取我的授权 token 。在导出中,我想包含此 fn 的返回值。

我的第一次尝试:

const token = await sessionHandler.getToken();

export const httpService = axios.create({
    ...
    headers: {
        "auth-token": token
        ...
    }
});

当然这是行不通的,因为 await 不在异步函数中。 所以我可以把它包装在一个异步函数中,对吧?不,因为我必须使用回调。然后我又不会在顶层导出,这也不起作用。

解决这个问题的最佳方法是什么?

最佳答案

这是不可能的。 导出必须以同步方式定义,您不能在导出前等待。

我建议您导出一个异步函数。如果您不想每次都请求 token ,您可以考虑保存它:

let token;

export const createHttpService = async () => {
  token = token == null ? await sessionHandler.getToken() : token;
  return axios.create({
    /* ... */
    headers: {
        "auth-token": token
        /* ... */
    }
  });
};

但是,如果这对你来说是可以接受的,我想我更愿意分离这个 token 的请求,让模块的消费者将它传递回 createHttpService(并因此负责保存它)。

export const getToken = () => sessionHandler.getToken();

export const createHttpService = (token) => {
  return axios.create({
    /* ... */
    headers: {
        "auth-token": token
        /* ... */
    }
  });
};

或者,如果您真的想在模块加载时需要 token ,您可以直接导出 promise 。但是,我建议要警惕模块加载时的副作用。

关于javascript - JS : Call async function before exporting something,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44566480/

相关文章:

javascript - angular2 zone.js 进行自动 sock.js 调用

javascript - 获取应用程序路由中的当前路径

javascript - 如何让 promise.all 等待嵌套的 promise.all?

c# - 澄清多线程/异步/并行编程

asynchronous - Kotlin:将 "normal"函数转换为阻塞挂起函数对性能有何影响?

快速异步网络。出现错误时如何重试?

javascript - HTML表格-为每个<td>创建弹出框并显示xml数据

javascript - 具有属性的 JSX 动态标签

javascript - 在异步函数内提前返回

c# - 创建永不返回的任务的最简洁方法是什么?