Дождитесь окончания функции, прежде чем возвращать значение

#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 .