首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS:导出东西之前调用异步函数

问JS:导出东西之前调用异步函数
EN

Stack Overflow用户
提问于 2017-06-15 11:35:33
回答 2查看 3.7K关注 0票数 5

我需要调用一个异步函数来获得我的令牌。在导出中,我希望包含从这个fn返回的值。

我的第一次尝试:

代码语言:javascript
复制
const token = await sessionHandler.getToken();

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

当然,这不起作用,因为await不在异步函数中。所以我可以把它封装在一个异步函数中,对吗?不,因为我得用回调。再说一次,我也不会把出口放在最高级的水平上,这也不起作用。

最好的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-15 11:57:48

如果httpService不能是异步的,那么我将使用interceptors来满足这种需求,如果令牌在第一个请求时还没有准备好,那么拦截器将等待承诺实现。令牌只会被请求一次。

代码语言:javascript
复制
const axios = require('axios')
const token = sessionHandler.getToken();

export const httpService = axios.create({
  ...
  headers: {
    ...
  }
});

httpService.interceptors.request.use(function(config) {
  return token.then(token => {
    config.headers['auth-token'] = token;
    return config;
  })
}, function(error) {
  console.dir(error)
  // Do something with request error
  return Promise.reject(error);
});

编辑我个人更喜欢数据只是按需请求而不是包含,所以我会使用稍微不同的版本:

代码语言:javascript
复制
const axios = require('axios')
let token;

export const httpService = axios.create({
  ...
  headers: {
    ...
  }
});

httpService.interceptors.request.use(function(config) {
  token = token || sessionHandler.getToken(); //request it only if not already requested.

  return token.then(token => {
    config.headers['auth-token'] = token;
    return config;
  })
}, function(error) {
  console.dir(error)
  // Do something with request error
  return Promise.reject(error);
});
票数 3
EN

Stack Overflow用户

发布于 2017-06-15 11:50:40

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

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

代码语言:javascript
复制
let token;

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

但是,如果这是您可以接受的,我想我更愿意分离这个令牌的请求,让模块的使用者将它传递回createHttpService (从而负责保存它)。

代码语言:javascript
复制
export const getToken = () => sessionHandler.getToken();

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

或者,如果您确实希望在加载模块时需要令牌,则可以直接导出承诺。不过,我建议您注意模块加载时的副作用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44566480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档