У меня есть ситуация, в которой мне нужно дождаться, пока наблюдаемое начнет выдавать значения, прежде чем будет выполнен последующий код. Самое близкое, что я получил до сих пор, выглядит так:
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 относится к неправильному контексту, но это другой вопрос.
Как я могу создать наблюдаемое, которое будет блокировать выполнение до тех пор, пока не будет выдано значение?
опишите Зачем вам это нужно. Решение вашей проблемы - нет для блокировки во время ожидания наблюдаемого. Это сделать ваш другой код асинхронным.
Почему бы не структурировать код таким образом, чтобы при получении первого значения код выполнялся, а не пытался блокироваться до тех пор. Другими словами, выполните заданный обратный вызов, когда первое значение выдается наблюдаемым.
Я не понимаю. Если getContent() возвращает Observable, почему бы и нет getContent().subscribe(() => console.info('Got content'))?
Спасибо всем за ваши ответы. Вы абсолютно правы, Брэндон и Франций. Мне нужно, чтобы потребляющий код выполнялся асинхронно. Я сделаю это так.
Я не уверен, что этот сценарий и рефакторинг, который я сделал, помогут вам, но это может дать вам некоторые идеи stackoverflow.com/questions/48150472/…





Следующего кода должно быть достаточно.
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(...)
то, что вы спрашиваете, невозможно в общем случае - механизмы JavaScript являются однопоточными, а это означает, что если вы заблокируете один поток, чтобы дождаться наблюдаемого для создания значения, то для этого асинхронного механизма не будет потока, доступного для запуска и создания его ценность