Ожидание изменения переменной

#javascript #angular #typescript

#javascript #угловой #typescript

Вопрос:

У меня есть наблюдаемое, которое необходимо выполнить перед следующей инструкцией

 export class MyExample implements OnInit {
    flag;

    constructor(private myService: MyService) { }

    myFunc() {
        flag = 0;
        this.myService.subscribe(data => {
            this.consumeData(data);
            this.flag = 1;
        });
    }
}
  

Подготовка инструкций внутри subscribe() может занять несколько секунд. Мне нужно преобразовать init() функцию в async init() . Я добавил flag , который работает как индикатор успеха, но я не смог найти способ объединить наблюдаемое с асинхронной функцией (или, может быть, просто обещание).

В моем компоненте я хочу вызвать init() таким образом:

 this.myFunc().then(() => console.log('ok'));
  

Комментарии:

1. async работает с Promise . Ключевое слово async дает понять, что такой метод возвращает a Promise и позволяет использовать await для методов, возвращающих a Promise . К сожалению, это не имеет особого отношения к Observables . Есть ли какая-либо причина для использования наблюдаемого здесь? Возможно, вы просто захотите сделать: return this.myService.subscribe(data => { this.consumeData(data); this.flag = 1; }).toPromise(); .

2. @JaromandaX Я в курсе этого. Я просто говорю о синтаксисе

3. никаких проблем, казалось, что вы думали, что это две разные вещи — комментарий удален

4. Что такое init()? Вы говорите о ngOnInit(), который не реализован в вашем фрагменте?

5. @jo_va Я отредактировал сообщение. Это не ngOnInit()

Ответ №1:

Если вы хотите рассматривать наблюдаемое как обещание, то проще всего было бы await this.myService.toPromise() .

Ответ №2:

Наблюдаемое — это своего рода поток данных… Если у вас есть только одно значение, выходящее из наблюдаемого, рассмотрите возможность использования

 return this.myService.
  .pipe(take(1))
  .subscribe(...)
  

таким образом, наблюдаемое также будет автоматически отменено.

вы также можете вызвать toPromise() вместо subscribe(...) и использовать результат как обещание

 return this.myService.
  .pipe(take(1))
  .toPromise().then(...)
  

затем вы можете использовать await вместе с ним

Комментарии:

1. В моем случае служба представляет собой Bluetooth с низким энергопотреблением (BLE). Мне нужно подключиться к сервису, а затем запустить уведомления. Таким образом, это не одно значение. для подключения к периферийному устройству требуется около 3 секунд. Уведомление о запуске также является наблюдаемым. Он вложен в наблюдаемый объект подключения. Что мне нужно сделать, это убедиться, что устройство подключено, и подписаться на уведомления, а затем позволить приложению работать в обычном режиме.

Ответ №3:

Observable можно легко преобразовать в promises с помощью toPromise() оператора.

 async myFunc() {
    return this.myService.doSomething().pipe(
         tap(data => this.consumeData(data)) 
    ).toPromise();
}