使用异步操作之后会发现我们在写代码的时候会出现很多层方法的嵌套,在方法嵌套的同时需要注意几项。
1、嵌套之后没有使用箭头函数的话,嵌套内的函数内部this指向的作用域不同,这个时候需要定义一个新变量再插入进去,this的指向不会变。
/**
* 监听适配器状态变化
*/
//方法一
wx.onBluetoothAdapterStateChange(this.adaptorStateCallback.bind(this))
//方法二
let rallback = this.adaptorStateCallback()
wx.onBluetoothAdapterStateChange(rallback)
2、如果内部嵌套多次或者使用多次回调有可能会导致死循环,深渊.....所以需要我们此时使用一些特殊方法去避免此类问题的发生。
一般不适用循环嵌套,用success和fail,直接使用await 去等待,使用try...(嵌套的方法)....catch.......(fanally).....
或者使用 方法.then(成功执行).catch(失败).fanally(最终执行).......
//切换到OTA模式
async switchOTAMode(deviceId = this.getMac()) {
//连接蓝牙
this.isSwitchMode = true;
const bleUtil = this.bleUtil;
await bleUtil.connectDevice({
deviceId: deviceId,
connectStateCallback: this.connectStateCallback.bind(this)
}).catch(err => {
console.error(err)
})
setTimeout(async () => {
try {
await bleUtil.sendMsg(null, Uint8Array.from([0x01, 0x02]), null);
} catch (err) {
console.error(err);
//TODO handle the exception
} finally {
await bleUtil.close();
}
// this.isSwitchMode = true;
setTimeout(async () => {
const macStr = this.deviceId.substring(3)
console.log(macStr)
console.log(deviceId);
if (!deviceId) {
this.refreshCallback(false, '找不到,请确认设备在身边')
return
}
if (ota) {
this.sendOTAData(deviceId)
} else {
this.refreshCallback(false, 'OTA模式打开失败')
}
}, 3000)
}, 2000);
}
如果代码有什么问题或者思考有问题,欢迎指正。此笔记只作为参考,也是自己做的记录笔记,以后会多使用,来处理前端常见的异步。