JsBridge的异步不执行的处理--promise异步变同步

Hybird App:H5内嵌APP,前端用vue,APP之间的交互处理,适配安卓ios, 为了下降开发成本,减小前端适配工做量,三端统一使用  WebViewJavascriptBridge前端

在进行后端接口请求的时候统一先把参数返给APP端,APP端进行加密以后,再返回给前端,前端再进行异步请求vue

因为这里涉及到异步操做,异步请求可能会在和APP交互以前执行,那样就得不到APP返回的加密参数就执行了请求,因此是请求不到结果的,实际是要有前后顺序的,要一步一步的操做,上一步成功以后进行下一步操做,android

因此最终利用promise把APP,H5和后端之间的交互进行同步处理,一步一步进行交互操做,最终成功ios

1. 先写web端的bridge.jsgit

var u = navigator.userAgent;
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
// alert('是不是Android:'+isAndroid);
// alert('是不是iOS:'+isiOS);
function setupWebViewJavascriptBridge(callback) {
  if(isAndroid){
    if (window.WebViewJavascriptBridge) {
    callback(WebViewJavascriptBridge)
    } else {
      document.addEventListener('WebViewJavascriptBridgeReady', function (event) {
          if(window.onWebViewJavascriptBridgeReady) window.onWebViewJavascriptBridgeReady(window.__bridge = WebViewJavascriptBridge);
          callback(WebViewJavascriptBridge)
      }, false)
    }
  }
  
  if(isiOS){
    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
  }
  
}

export default {
  callhandler (name, data, callback) {
    setupWebViewJavascriptBridge(function(bridge) {
      bridge.callHandler(name, data, callback)
    })
  },
  registerhandler (name, callback) {
    setupWebViewJavascriptBridge(function (bridge) {
      bridge.registerHandler(name, function (data, responseCallback) {
        callback(data, responseCallback)
      })
    })
  }
}

2. 封装和APP交互的方法 callBridge.jsgithub

export default {
    methods:{
        callBridgefn(json){ // 调用app加密方法
            let p = new Promise((resolve, reject)=>{
                this.$bridge.callhandler('encryptParams', JSON.stringify(json),(data) =>{  //encryptParams是APP端规定的方法名
            resolve(data) })
})
return p;
},
    goBack(){ // 调用APP的返回
      
this.$bridge.callhandler('goBack', (data) =>{ // goBack是APP端规定的方法名
    })
  }
}
}

3. 利用promise重写axios异步请求方法 promise.jsweb

import axios from 'axios'

export default{
    methods:{
     sendServer(param) { 
        return new Promise((resolve,reject)=>{            
                axios.post(url ,param).then(res=>{ // url为请求地址
                resolve(res.data)
            }).catch(err=>{
                reject(err)
            })
        })
     },
    }
}
    

4. 页面中请求接口的方法json

_sendServer(param){
this.callBridgefn(param).then(data=>{
  this.sendServer(JSON.parse(data))
    .then(res=>{
 // 这里写要对后端返回的数据进行的操做 }) })
}

5. 在页面初始化的时候调用axios

created(){
     this._sendServer(param) //param是要传递给APP进行加密的参数
}
相关文章
相关标签/搜索