h5頁面(vue) 與jsBridge交互

框架:vue3.0
混合開發(fā)
需求:根據(jù)后臺接口是否返回1401來刷新token,token刷新后重新調(diào)上一個接口

封裝jsBridge

function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) {
        return callback(WebViewJavascriptBridge);
    } else {
        document.addEventListener('WebViewJavascriptBridgeReady', function () {
            callback(WebViewJavascriptBridge)
        }, false);
        if (window.WVJBCallbacks) {
            return window.WVJBCallbacks.push(callback);
        }
        window.WVJBCallbacks = [callback];
        var WVJBIframe = document.createElement('iframe');
        WVJBIframe.style.display = 'none';
        WVJBIframe.src = 'https://__bridge_loaded__';
        document.documentElement.appendChild(WVJBIframe);
        setTimeout(function () {
            document.documentElement.removeChild(WVJBIframe)
        }, 0)
    }
}
 
//初始化
setupWebViewJavascriptBridge(function (bridge) {
    try {
        bridge.init(function (message, callback) {
            callback(null);
        })
    } catch (e) { }
});

export default {
    //js調(diào)APP方法 (參數(shù)分別為:app提供的方法名  傳給app的數(shù)據(jù)  回調(diào))
    callhandler: function (method, params, callback) {
        setupWebViewJavascriptBridge(function (bridge) {
            bridge.callHandler(method, params, callback)
        })
    },

    // APP調(diào)js方法 (參數(shù)分別為:js提供的方法名  回調(diào))
    registerHandler(method, callback) {
        setupWebViewJavascriptBridge((bridge) => {
            bridge.registerHandler(method, (data, responseCallback) => {
                callback(data, responseCallback)
            })
        })
    }
}

按需引入

import jsBridge from '地址';

在request.js的請求攔截部分處理

1.定義調(diào)用jsBridge的方法
function reFreshToken(){
      return new Promise(function(resolve,reject){
                  JsBridge.callhandler('refreshToken',{},function(appResponse){
                      resolve(appResponse)  ;
                });
      }) ;
};

2.定義公共方法去調(diào)用reFreshToken,
function handleRefreshToken(config){
        return reFreshToken().then(res=>{
              let data=JSON.parse(res);
              setAccessToken(data.access_token);   //將accessToken存sessionStorage
              const {token} =data.access_token;
              config.headers['access-token']=getAccessToken();
              config.baseURL='';
              request.forEach(cb=>{
                    cb(token);
              });
              requests = [] ;
              return request(config);
      }).catch(err=>{
              console.log(err,'刷新token錯誤')
      }).finally(()=>{
              isRefreshing=false;   //標志,為了防止重復調(diào)用
      })
}

3.在請求攔截和error里面判斷是否返回1401
    if(response.data.code === 1401){
          if(!isRefreshing){
                isRefreshing=true;
                handleRefreshToken(config);
          };
    };
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容