我想编写一个很好的,整洁的“登录”功能,该功能用于通过向其发送密码来登录蓝牙外围设备。
public async Task<bool> LogIn()
{
bool result = false;
//First log in
var connectHook = Device.ConnectHook(BleService.Control, new Guid[] { BleCharacteristic.PasswordResult });
connectHook.Subscribe(ScanResult =>
{
ScanResult.Characteristic.DisableNotifications();
//Succesful Login
if (ScanResult.Data[0] == 1)
{
result = true;
}
//Failed Login
else
{
result = false;
}
});
await Device.WriteCharacteristic(BleService.Control, BleCharacteristic.Password, PasswordBytes);
await connectHook.FirstAsync();
return result;
}
我基本上想订阅密码结果特征,然后编写密码,然后等待密码结果,然后从函数返回。
这是履行诺言的地方吗?我已经阅读了有关它们的内容,但不了解其用法。
谢谢
编辑:
做了一些挖掘,认为我找到了一个很好的答案。我已经更新了上面的代码以反映出来,请告诉我您的想法。
编辑2:
因此,上面的代码不起作用,因为没有返回任何内容
await connectHook.FirstAsync();
如果我对该行进行注释,则所有工作正常。...但似乎正常,因为我遇到了争用情况,并且在其他代码完成之前通知已返回。
该函数是否神奇地等待该通知?我认为可观察的实现IEnumerable会返回第一项,只要它回来了?我是这种反应性材料的新手,请保持友好。
答案 0 :(得分:0)
在您的代码中:
方法connectHook.Subscribe
是异步方法。在添加两个await
方法之前,函数login
将直接返回false,而无需等待connectHook.Subscribe
中的回调,因此无论您是否login
中的返回值都不会更改登录成功或登录失败。
在添加了两个await
方法之后,我猜想connectHook.Subscribe
中的回调是在这两个方法运行完毕之后触发的。因此,返回值将与回调中的返回值一起更改。