常用Promise方法处理替换success和fail

本文探讨了使用异步操作时遇到的嵌套问题及解决方法,包括this指向问题、避免死循环的方法以及通过async/await、try/catch等手段优化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用异步操作之后会发现我们在写代码的时候会出现很多层方法的嵌套,在方法嵌套的同时需要注意几项。

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);
	}

如果代码有什么问题或者思考有问题,欢迎指正。此笔记只作为参考,也是自己做的记录笔记,以后会多使用,来处理前端常见的异步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值