останавливать функцию сканирования каждые 10 сек c, затем снова запускать, пока что-то не закончится sh - angular 8 - PullRequest
0 голосов
/ 28 апреля 2020

Привет, ребята, я работаю с ioni c нативной библиотекой , которая дает мне некоторые инструменты для подключения Bluetooth и прочее, мне нужна небольшая помощь с наблюдаемыми rx js, чтобы сделать функцию для запуска bluetooth Сканер, когда я вхожу в свой вид в течение 15 секунд, затем прекращаю функцию, повторяю через 2 секунды и запускаю ее снова в течение 15 секунд, пока мой процесс подключения Bluetooth не будет завершен, это мои основные функции, которые мне нужны, чтобы заставить его работать, как объяснено:

// here i want to start the scan for 15 seconds to search for a device //but some times it doesn't appear the first scan so i need to refresh //my view to find the device for that i want to "retry" the scan every // 15 seconds

this.ble.startScan([]).subscribe(
          foundDevice => { 
          if(foundDevice.name.includes('myDevice'){
            // here im going to connect
            connectToDevice(foundDevice);
          }
          
          }
   });
   
   
// when connect to device finish then stop the scan

connectToDevice(foundDevice){
this.ble.connect(foundDevice.id).subcribe(
  () => {
    // show some message
    myMessageFunction('yaaay, connected');
    /// stop the scan function
    this.ble.stopScan();
  }
)

}

Я действительно понятия не имею, как заставить это работать, потому что я знаю только о подписчиках.

заранее спасибо!

1 Ответ

1 голос
/ 29 апреля 2020

С некоторой недостающей информацией вот мое мнение:

// lets build a wrapper to have the library wrapped as a reactive stream
const bluetoothScan$: Observable<Device> = defer(() => {
  return new Observable<Device>(observer => {
    const sub = bluetoothService.startScan().subscribe(observer);

    return () => {
      bluetoothService.stopScan();
      sub.unsubscribe;
    };
  });
});

const bluetoothScanPolling$: Observable<Device> = bluetoothScan$.pipe(
  timeout(15000),
  repeatWhen(() => timer(2000))
);

const deviceConnected$: Observable<Device> = bluetoothScanPolling$.pipe(
  filter(foundDevice => foundDevice.name.includes("myDevice")),
  switchMap(foundDevice => bluetoothService.connect(foundDevice.id)),
  take(1)
);

const displayMessageWhenDeviceConnected$: Observable<
  any
> = deviceConnected$.pipe(
  tap(device => console.log(`Device with ID ${device.id} is now connected`))
);

bluetoothScan$ позволяет нам превратить начальное сканирование в наблюдаемое, из которого, когда мы отписываемся, мы автоматически вызываем stopScan.

Тогда мы можем использовать timeout для остановки через 15 с и repeatWhen для повторной подписки на наблюдаемое через 2 с.

Надеюсь, это имеет смысл. Вот блик стека https://stackblitz.com/edit/rxjs-jxbphv, но без бегущего кода, чтобы просто поиграть с ним

...