#angular #ionic4
#angular #ionic4
Вопрос:
Я работаю над приложением (Ionic), которое использует Bluetooth.
У меня есть несколько страниц для подключения к моим устройствам. Итак, я создал службу для управления подключением.
Это мой сервис :
public async bleConnexion(device) {
this.loader = await this.loadCtrl.create({
message: "Connexion ..."
})
this.loader.present();
setTimeout(async () => {
if (this.isConnected == false) {
this.displayError();
}
}, 15000);
this.ble.connect(device.bleID).subscribe(async res => {
this.loader.dismiss();
this.isConnected = true;
console.log(res);
return true;
}, async error => {
console.log(error);
return false;
});
return this.isConnected;
}
В моем компоненте, к которому я хочу подключиться, мне нужно знать, подключен я или нет. Но моя служба возвращает false перед завершением «ble.connect».
Как я могу дождаться соединения, прежде чем возвращать мое значение?
var result = this.myService.bleConnexion(myDevice) // return always false (default value of this.isConnected)
Комментарии:
1. Ваша функция продолжит выполнять строки кода, не дожидаясь
this.ble.connect
публикации значения. Это означаетreturn this.isConnected;
, что всегда будет последнее значение, на которое оно было установлено. ПеременныеisConnected
иloader
являются общими состояниями, это то, что вы хотите?bleConnexion
Многократный вызов, скорее всего, приведет к неправильным результатам.
Ответ №1:
Используйте async с await .
var result = await this.myService.bleConnexion(myDevice);
Некоторые пояснения :
Ключевое слово await заставляет среду выполнения JavaScript приостанавливать ваш код в этой строке, позволяя тем временем выполнять другой код, пока асинхронный вызов функции не вернет свой результат. Как только это будет завершено, ваш код продолжит выполняться, начиная со следующей строки.
Из : https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await
Комментарии:
1. Проблема в том, что я получаю значение this.isConnected до окончания bleConnect. Si это всегда False .