Выполнение наблюдаемого «запуска» синхронно

У меня есть ситуация, в которой мне нужно дождаться, пока наблюдаемое начнет выдавать значения, прежде чем будет выполнен последующий код. Самое близкое, что я получил до сих пор, выглядит так:

async ensureContentLoaded() {
  if (!this.content) {
    defer(async () => {
      this.content = await this.getContent();
      console.info(`Got content`);
    }).subscribe();

    console.info(`Finished`);
  }

На данный момент журнал консоли Finished появляется перед Got content. Я хочу, чтобы наблюдаемое «блокировалось», пока оно не начнет выдавать значения. Обратите внимание, что this.getContent() возвращает обещание; хотя он может легко вернуть наблюдаемое, если это имеет значение. Также я знаю, что this.content относится к неправильному контексту, но это другой вопрос.

Как я могу создать наблюдаемое, которое будет блокировать выполнение до тех пор, пока не будет выдано значение?

то, что вы спрашиваете, невозможно в общем случае - механизмы JavaScript являются однопоточными, а это означает, что если вы заблокируете один поток, чтобы дождаться наблюдаемого для создания значения, то для этого асинхронного механизма не будет потока, доступного для запуска и создания его ценность

Brandon 21.02.2019 17:38

опишите Зачем вам это нужно. Решение вашей проблемы - нет для блокировки во время ожидания наблюдаемого. Это сделать ваш другой код асинхронным.

Brandon 21.02.2019 17:39

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

francium 21.02.2019 17:41

Я не понимаю. Если getContent() возвращает Observable, почему бы и нет getContent().subscribe(() => console.info('Got content'))?

Arnaud Denoyelle 21.02.2019 17:41

Спасибо всем за ваши ответы. Вы абсолютно правы, Брэндон и Франций. Мне нужно, чтобы потребляющий код выполнялся асинхронно. Я сделаю это так.

serlingpa 21.02.2019 17:49

Я не уверен, что этот сценарий и рефакторинг, который я сделал, помогут вам, но это может дать вам некоторые идеи stackoverflow.com/questions/48150472/…

JGFMK 21.02.2019 18:00
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
6
1 076
1

Ответы 1

Следующего кода должно быть достаточно.

ensureContentLoaded() {
  if (this.content) return of(this.content);
  return from(this.getContent());
}
// usage 
this.ensureContentLoaded().subscribe(console.info);
// or turn it to promise if needed
this.ensureContentLoaded().pipe(toPromise()).then(...)

Другие вопросы по теме