在做一个首页轮播图需要一维码,点击轮播图单项出现弹窗,显示一维码加二维码需求。
问题:使用了太多的canvas,因为canvas是原生组件,所以不存在层级限制。而且弹窗中的画布有时候出现有时候不出现的。
解决方案:1. 想重开一个页面 内容时弹窗内容 (未通过,小程序页面会缓存,也会出现时有时没有)。
2. 整体画布转换为图片,然后使用没有限制。
所以采用了第二种方案,但是又出现了问题,画布转图片是一个异步过程。所以第一次使用的时候图片地址不存在,但是当轮播图开始轮播时 又出现了。
解决方案:1.开始想的是深度监听轮播图数组,来更新数据,但是发现只出现一个打印。(未通过,只有一个打印)
2. 在1的基础上,使用$set去改变数据,但是发现还是监听不了。(未通过)
3. 使用async/await,不是很理解用法,第一次使用失败。(未通过)
4.在3的基础上,与promise结合,第一次是一个promise,包括两个异步保存函数(未通过)
5. 在4的基础上,尝试一个异步与一个promise结合,在与async/await结合 (成功)
var data = [ { birthday: "1995-10-26", gander: 1, healthCardNo: "123456789012", idCardNo: "231341231253121", openId: "wx231235151", patientId: "324154123151", patientName: "郑志福", phone: "13532565621", phoneIsVerify: false, unionId: "124435451231", userType: "patien" } ]; this.dataList = data.map(({ healthCardNo }) => { return { healthCardNo }; }); this.setCanvasUrl(this.dataList).then(res => { var a = []; res.forEach((v, i) => { a.push(Object.assign({}, data[i], v)); }); this.cardList = a; this.$store.commit("SET_HEALTH_CARD_LIST", a); this.dataList = []; }); async setCanvasUrl(data) { const _data = JSON.parse(JSON.stringify(data)); for (var i = 0; i < _data.length; i++) { const brId = "barcode" + _data[i].healthCardNo; const qrId = "qrcode" + _data[i].healthCardNo; await this.setBarCanvas(brId, _data[i].healthCardNo, 500, 160).then( res => { _data[i].barcodeUrl = res; } ); await this.setQrCanvas(qrId, _data[i].healthCardNo, 440, 440).then( res => { _data[i].qrcodeUrl = res; } ); } return _data; }, setBarCanvas(brId, healthCardNo, w, h) { return new Promise((resolve, reject) => { wxbarcode.barcode(brId, healthCardNo, 500, 160, () => { wx.canvasToTempFilePath({ canvasId: brId, quality: 1, success(res) { resolve(res.tempFilePath); }, fail(err) { console.log(err); } }); }); }); }, setQrCanvas(qrId, healthCardNo, w, h) { return new Promise((resolve, reject) => { wxbarcode.qrcode(qrId, healthCardNo, 440, 440, () => { wx.canvasToTempFilePath({ canvasId: qrId, quality: 1, success(res) { resolve(res.tempFilePath); }, fail(err) { console.log(err); } }); }); }); },
总结: 一个异步一个promise,async/await是处理多个异步的。
比如说你一个函数A,需要函数B与函数C都执行完成以后在执行,那么使用async。
那么函数B与函数C就需要使用Promise封装了。(ps: B与C内部没有异步函数调用的话,那么没必要使用async/await语法)













