Vue async+await实现同步执行

 今天在测试微信扫一扫的时候,发现了一个很奇怪的问题。点击扫一扫的时候第一次总是打不开,再点一次就正常了。

后来仔细看代码才发现:获取js-sdk验证和打开扫一扫分成了两个方法。首先调用验证方法,然后调用打开扫一扫。但是居然先打印的扫一扫里面的信息。这就很奇怪了。后来查阅资料发现了:js是异步执行的,导致了还没有验证成功,就执行了打开扫一扫功能。

要想不改原代码,能治寻找其他的办法了,先执行验证方法,再执行扫一扫方法。async+await 可以实现。

由于在saoyisao方法里面调用了JSSDK方法,而JSSDK方法是异步的,所以导致了saoyisao方法整个成了异步的。

解决后的代码如下:

methods: {
        JSSDK: function() {     //获取微信js-sdk验证,这里需要设置为同步请求,验证成功后才可访问
            return new Promise((resolve, reject) => {
                let webUrl = location.href.split('#')[0];
                let params = {
                    'webUrl' : webUrl
                };
                this.$fetch('/WXJSSDK', params).then((data) => {
                    wx.config({
                        debug : false,
                        appId : data.weixin.appId,
                        timestamp : data.weixin.timestamp,
                        nonceStr : data.weixin.nonceStr,
                        signature : data.weixin.signature,
                        jsApiList : [ 'checkJsApi', 'scanQRCode','getLocation','openLocation' ]
                    });
                    this.isLoad = true;
                    resolve(this);
                });
            });
        },
        async saoyisao() {      //扫一扫功能
            if (!this.isLoad) {
                await this.JSSDK();
            }
            this.$dialog.toast({mes: '正在打开摄像头...', timeout: 1500});
            wx.scanQRCode({
                desc : 'scanQRCode desc',
                needResult : 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                scanType : [ "qrCode", "barCode" ], // 可以指定扫二维码还是一维码,默认二者都有
                success : function(res) {// 回调时可以自己处理返回的结果
                    //console.table(res.needResults);
                },
                error : function(res) {
                    if (res.errMsg.indexOf('function_not_exist') > 0) {
                        this.$dialog.toast({ mes: '版本过低请升级',timeout: 1500,icon: 'error',});
                    }
                },
                cancle : function(res) {
                    this.$dialog.toast({ mes: '已拒绝访问摄像头',timeout: 1500,icon: 'error',});        
                }
            });
        }
        },

如果写的更规范一点,回调单独处理:

JSSDK: function() {     //获取微信js-sdk验证,这里需要设置为同步请求,验证成功后才可访问
            return new Promise((resolve, reject) => {
                let webUrl = location.href.split('#')[0];
                let params = {
                    'webUrl' : webUrl
                };
                this.$fetch('/WXJSSDK', params).then((data) => {
                    resolve(data); // 调用resolve方法时,会调用promise的then回调
                });
            }).then(data => {
                wx.config({
                    debug : false,
                    appId : data.weixin.appId,
                    timestamp : data.weixin.timestamp,
                    nonceStr : data.weixin.nonceStr,
                    signature : data.weixin.signature,
                    jsApiList : [ 'checkJsApi', 'scanQRCode','getLocation','openLocation' ]
                });
                this.isLoad = true;
            }).catch(res => {
                console.log('jssdk error');
            });
        }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值