Аналогічний шукає відповідь була 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
.