Аналогичный ищет ответ был downvoted. Но я думаю, что могу оправдать то, что я предлагаю здесь для ограниченных случаев.
Хотя верно, что наблюдаемая не имеет текущего значения, очень часто она будет иметь сразу доступное значение. Например, в хранилищах redux / flux / akita вы можете запрашивать данные из центрального хранилища, основываясь на количестве наблюдаемых, и это значение обычно будет сразу же доступно.
Если это так, то когда вы subscribe
, значение вернется немедленно.
Допустим, у вас был вызов в службу, и по окончании вы хотите получить из своего магазина самую свежую ценность, которая потенциально может не генерироваться :
Вы можете попытаться сделать это (и вы должны как можно больше держать вещи «в трубах»):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
Проблема в том, что он будет блокироваться до тех пор, пока вторичная наблюдаемая не выдаст значение, которое потенциально может никогда не быть.
В последнее время я обнаружил, что мне нужно оценивать наблюдаемое только в том случае, если значение было немедленно доступно , и, что более важно, мне нужно было уметь определять, не было ли оно. Я закончил тем, что сделал это:
serviceCallResponse$.pipe()
.subscribe(serviceCallResponse => {
// immediately try to subscribe to get the 'available' value
// note: immediately unsubscribe afterward to 'cancel' if needed
let customer = undefined;
// whatever the secondary observable is
const secondary$ = store$.select(x => x.customer);
// subscribe to it, and assign to closure scope
sub = secondary$.pipe(take(1)).subscribe(_customer => customer = _customer);
sub.unsubscribe();
// if there's a delay or customer isn't available the value won't have been set before we get here
if (customer === undefined)
{
// handle, or ignore as needed
return throwError('Customer was not immediately available');
}
});
Обратите внимание, что для всего вышеперечисленного я использую, subscribe
чтобы получить значение (как обсуждает @Ben). Не используя .value
собственность, даже если бы у меня был BehaviorSubject
.