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

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

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

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

所以最终利用promise把APP,H5和后端之间的交互进行同步处理,一步一步进行交互操作,最终成功

1. 先写web端的bridge.js

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.js

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.js

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. 页面中请求接口的方法

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

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

created(){
     this._sendServer(param) //param是要传递给APP进行加密的参数
}

 

转载于:https://www.cnblogs.com/leiting/p/9897759.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中,异步函数可以通过使用Promise对象、async/await等方式来实现同步执行的效果。Promise是一种用于处理异步操作的对象,它可以将异步函数的执行结果以同步的方式返回。具体来说,可以按照以下步骤实现异步函数同步执行的效果: 1. 使用Promise对象封装异步函数,将异步操作包裹在Promise的回调函数中。 2. 在封装的异步函数内部,通过resolve来返回异步操作的结果。 3. 在调用异步函数的地方,使用await关键字来等待异步函数执行完毕并获取结果。 4. 使用async关键字将包含异步函数调用的父函数标记为异步函数。 例如,假设我们有一个Vue组件,其中包含了两个异步函数testOne和testTwo。我们可以通过使用Promise和async/await来实现这两个函数的同步执行。 ``` methods: { testOne() { return new Promise((resolve, reject) => { setTimeout(function () { resolve('我是第一个函数的返回值'); }, 500); }); }, async testTwo(data) { console.log(data); console.log('得到data进行下一步的操作'); }, async resultFn() { let data = await this.testOne(); await this.testTwo(data); } } ``` 在上述代码中,testOne函数被封装成了返回Promise对象的形式,通过resolve将异步操作的结果返回。而testTwo函数使用了async关键字,表示它是一个异步函数。在resultFn函数中,我们使用了await关键字来等待testOne函数执行完毕并获取结果,然后再将结果传递给testTwo函数进行下一步的操作。这样就实现了异步函数的同步执行效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值