2015-12-09 4 views
31

Я хотел бы быть в состоянии ждать на наблюдаемом, например,Как я могу «ждать» на наблюдаемом Rx?

const source = Rx.Observable.create(/* ... */) 
//... 
await source; 

наивной попытка приводит в AWAIT разрешающих сразу и не блокирует выполнение

Edit: псевдокода для моего полного предполагаемого USECASE является:

if (condition) { 
    await observable; 
} 
// a bunch of other code 

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

+0

Не можете ли вы переместить оставшийся код (который вы хотите дождаться источника) в вызов метода .subscribe() '? – StriplingWarrior

ответ

39

Вы должны сдать обещание await. Преобразуйте следующее событие наблюдаемого в обещание и ожидайте этого.

if (condition) { 
    await observable.first().toPromise(); 
} 

Редактировать примечание: Этот ответ первоначально использовался .Снять (1), но было изменено, чтобы использовать .first(), который позволяет избежать проблем обещания никогда не разрешение, если поток завершается до того, как значение проступает.

+2

Вместо take (1) вы могли бы использовать 'await observable.first(). ToPromise();'? – apricity

+0

@apricity Это должно получиться так же. – AgentME

+8

@apricity Если значений по завершении не было, 'first()' приведет к отклонению, а 'take (1)' приведет к ожидающему обещания. – estus

5

Вам нужно будет await обещание, поэтому вы захотите использовать toPromise(). См. this для получения дополнительной информации о toPromise().

9

Он должен быть

await observable.first().toPromise(); 

Как было отмечено в комментариях прежде, есть существенная разница между take(1) и first() операторов, когда существует пустой завершено наблюдаемым.

Observable.empty().first().toPromise() приведет к отклонению с помощью EmptyError, который может обрабатываться соответствующим образом, что обычно является желательным поведением.

И Observable.empty().take(1).toPromise() приведет к ожидающему обещания, что желательно ... почти никогда.