RxJS Observable, который ждет на Observable
Итак, у меня есть наблюдаемая, которая делает HTTP-пост для получения токена доступа с сервера. У меня есть другой, который выполняет добраться до того же сервера, но требует токен доступа с первого раза, чтобы существовать. Поэтому я хотел бы иметь возможность подписаться на обе наблюдаемые одновременно в двух разных местах, но наблюдаемая GET должна, конечно, ждать наблюдаемой POST. Как я могу сделать наблюдаемое ожидание на другом завершении подписки на Наблюдаемые?
2 ответа
Не уверен, что я правильно понял, но здесь следует вариант. Если предположить, postHttp$
Набирается ли ваш токен доступа, и getFromServer$
тот, который выполняет get к серверу, и предполагая, что это последовательности только одного значения (то есть обещания):
postHttp$.flatMap(function (authToken){return $.ajax(...)})
будет ждать, пока postHttp будет иметь значение для создания обещания, которое будет сведено к его разрешенному значению. т.е.the GET observable (...) wait on the POST observable.
Чтобы получить значение, вы можете подписаться на наблюдаемое или продолжить связывать с ним другие операторы.flatMap
принимает обещания в качестве возвращаемого значения своего параметра функции селектора, поэтому здесь нет необходимости преобразовывать вRx.Observable
,
Это то, что вы хотели?
Я нашел решение, так что я решил пойти дальше и опубликовать свой собственный ответ. Если кто-нибудь знает более эффективный способ сделать что-то, обязательно опубликуйте ответ, и я приму его!
this.getObservable = Rx.Observable.create(function(observer){
this.postObservable.subscribe(null, null, function onComplete(){
var ajaxObservable = Rx.Observable.fromPromise($.ajax({
url: this.apiPath,
method: 'GET',
beforeSend: function (xhr) {
// this.authToken is created by the postObservable, so we have to subscribe to the oncomplete of that in order to use it.
xhr.setRequestHeader('Authorization', this.authToken);
}.bind(this)
}).promise());
ajaxObservable.subscribe(
function onNext(data){
observer.next(data);
},
function onError(error){
observer.error(error);
},
function onComplete(){
observer.complete();
}
);
}.bind(this));
}.bind(this));
В этом коде getObservable подписывается на postObservable, и только после завершения он выполняет собственный вызов Ajax. Это полезно, потому что позволяет моим страницам немедленно подписываться на все, что им нужно, на GET-наблюдаемость, и не нужно беспокоиться об аде обратного вызова: сначала подписаться на postObservable, а затем подписаться на следующую наблюдаемую, когда она будет готова. Для отдельной страницы почтовый запрос полностью скрыт, они просто подписываются на запрос на получение.
Обратите внимание, что этот код, вероятно, будет намного чище с функциями стрелок, но я пытаюсь быть совместимым с некоторыми старыми браузерами.