Мне нужно подписаться на несколько наблюдаемых при запуске страницы, и мне нужно дождаться всех ответов перед запуском. Первое, что я увидел, это forkjoin, но он терпит неудачу, когда одна внутренняя наблюдаемая выдает ошибку, и я теряю значение других наблюдаемых.
Я сделал что-то подобное, и это работает … но я уверен, что есть способ получше:
getResult(){
let importantObservableResponse1
let importantObservableResponse2
let observableResponse3
let observableResponse4
return new Observable(obs => {
this.firstObservable().subscribe(
response => {
importantObservableResponse1 = response
if (importantObservableResponse2, observableResponse3, observableResponse4)
obs.next([importantObservableResponse1, importantObservableResponse2, observableResponse3, observableResponse4])
}, error => {
let error = this.makeError(error)
obs.error(error)
}
)
this.secondObservable().subscribe(
response => {
importantObservableResponse2 = response
if (importantObservableResponse1, observableResponse3, observableResponse4)
obs.next([importantObservableResponse1, importantObservableResponse2, observableResponse3, observableResponse4])
}, error => {
let error = this.makeError(error)
obs.error(error)
}
)
this.thirdObservable().subscribe(
response => {
observableResponse3 = response
if (importantObservableResponse1, importantObservableResponse2, observableResponse4)
obs.next([importantObservableResponse1, importantObservableResponse2, observableResponse3, observableResponse4])
}, error => {
observableResponse3 = error
if (importantObservableResponse1, importantObservableResponse2, observableResponse4)
obs.next(error)
}
)
this.fourthObservable().subscribe(
response => {
observableResponse4 = response
if (importantObservableResponse1, importantObservableResponse2, observableResponse3)
obs.next([importantObservableResponse1, importantObservableResponse2, observableResponse3, observableResponse4])
}, error => {
observableResponse4 = error
if (importantObservableResponse1, importantObservableResponse2, observableResponse3)
obs.next(error)
}
)
})
}
Я поместил всю свою подписку в наблюдаемое, и когда у меня есть вся информация.
Есть ли способ хотя бы получить все ответы сразу, даже если некоторые из них не работают?
Имеет ли значение порядок ответа? Могут ли ответы быть нулевыми или неопределенными?
Если все, что вы хотите сделать, это выдать массив ответов, сделать так, чтобы все подписки обрабатывались одним и тем же способом, и я бы лично перенастроил механизм
getResult()
. В основном из-за того, что я не поклонник подобного расслоения наблюдаемых, это кажется слишком беспорядочным и трудным для чтения.Что я имею в виду под перенастройкой: иметь наблюдаемый результат, инициализированный и сидящий без дела, на который вещи могут подписаться, а не возвращать наблюдаемое как часть самого метода
getResult()
. Это позволяет любому количеству вещей подписаться на него, и вы можете произвольно получать / обновлять данные и отправлять указанные данные всем этим подписчикам, когда это происходит.И какой бы компонент использования у вас ни был:
Изменить: исправлена глупая ошибка со значением испускания.
Большое тебе спасибо! это то, что я искал !!! Я пытаюсь реализовать это, и у меня проблема со строкой this.result $ .next (this.resultResponses); на ручке Ответ. Он говорит, что свойство ‘next’ не существует для типа ‘Observable ‹any []›’. — person Brett; 02.12.2020
Ах, моя ошибка — это не наблюдаемое (
result$
) излучает (next()
), а наблюдатель (resultObs
). Замените это, и он должен работать нормально. — person Brett; 03.12.2020