#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
дает понять, что такой метод возвращает aPromise
и позволяет использоватьawait
для методов, возвращающих aPromise
. К сожалению, это не имеет особого отношения к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();
}