Skip to content

Instantly share code, notes, and snippets.

@mkjiau
Last active September 20, 2025 02:01
Show Gist options
  • Save mkjiau/650013a99c341c9f23ca00ccb213db1c to your computer and use it in GitHub Desktop.
Save mkjiau/650013a99c341c9f23ca00ccb213db1c to your computer and use it in GitHub Desktop.

Revisions

  1. mkjiau revised this gist Dec 27, 2017. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion axios-interceptors-refresh-token.js
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,3 @@
    let instance;
    let isRefreshing = false;
    let refreshSubscribers = [];

  2. mkjiau revised this gist Dec 27, 2017. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions axios-interceptors-refresh-token.js
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    static instance;
    static isRefreshing = false;
    static refreshSubscribers = [];
    let instance;
    let isRefreshing = false;
    let refreshSubscribers = [];

    const instance = axios.create({
    baseURL: Config.API_URL,
  3. mkjiau revised this gist Dec 27, 2017. 1 changed file with 3 additions and 5 deletions.
    8 changes: 3 additions & 5 deletions axios-interceptors-refresh-token.js
    Original file line number Diff line number Diff line change
    @@ -11,16 +11,14 @@ instance.interceptors.response.use(response => {
    }, error => {
    const { config, response: { status } } = error;
    const originalRequest = config;
    const { dispatch, getState } = store; // Redux store

    if (status === 498) {
    if (!isRefreshing) {
    isRefreshing = true;
    const { token: expiredToken } = getState().auth;
    dispatch(refreshAccessToken(expiredToken))
    .then(token => {
    refreshAccessToken()
    .then(newToken => {
    isRefreshing = false;
    onRrefreshed(token);
    onRrefreshed(newToken);
    });
    }

  4. mkjiau created this gist Dec 27, 2017.
    46 changes: 46 additions & 0 deletions axios-interceptors-refresh-token.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,46 @@
    static instance;
    static isRefreshing = false;
    static refreshSubscribers = [];

    const instance = axios.create({
    baseURL: Config.API_URL,
    });

    instance.interceptors.response.use(response => {
    return response;
    }, error => {
    const { config, response: { status } } = error;
    const originalRequest = config;
    const { dispatch, getState } = store; // Redux store

    if (status === 498) {
    if (!isRefreshing) {
    isRefreshing = true;
    const { token: expiredToken } = getState().auth;
    dispatch(refreshAccessToken(expiredToken))
    .then(token => {
    isRefreshing = false;
    onRrefreshed(token);
    });
    }

    const retryOrigReq = new Promise((resolve, reject) => {
    subscribeTokenRefresh(token => {
    // replace the expired token and retry
    originalRequest.headers['Authorization'] = 'Bearer ' + token;
    resolve(axios(originalRequest));
    });
    });
    return retryOrigReq;
    } else {
    return Promise.reject(error);
    }
    });

    subscribeTokenRefresh(cb) {
    refreshSubscribers.push(cb);
    }

    onRrefreshed(token) {
    refreshSubscribers.map(cb => cb(token));
    }