Một tương tự tìm câu trả lời đã được downvoted. Nhưng tôi nghĩ rằng tôi có thể biện minh cho những gì tôi đề nghị ở đây cho các trường hợp hạn chế.
Mặc dù đúng là một vật quan sát không có giá trị hiện tại , nhưng thường thì nó sẽ có giá trị ngay lập tức . Ví dụ: với các cửa hàng redux / flux / akita, bạn có thể yêu cầu dữ liệu từ một cửa hàng trung tâm, dựa trên một số vật quan sát và giá trị đó thường sẽ có sẵn ngay lập tức.
Nếu đây là trường hợp sau đó khi bạn subscribe
, giá trị sẽ trở lại ngay lập tức.
Vì vậy, giả sử bạn đã có một cuộc gọi đến một dịch vụ và khi hoàn thành, bạn muốn nhận được giá trị mới nhất của một thứ gì đó từ cửa hàng của mình, điều đó có khả năng không thể phát ra :
Bạn có thể cố gắng làm điều này (và bạn nên giữ càng nhiều càng tốt để giữ mọi thứ 'bên trong đường ống'):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
Vấn đề với điều này là nó sẽ chặn cho đến khi thứ cấp có thể quan sát được phát ra một giá trị, có khả năng không bao giờ có thể.
Gần đây tôi thấy mình chỉ cần đánh giá một giá trị có thể quan sát được nếu một giá trị có sẵn ngay lập tức và quan trọng hơn là tôi cần có khả năng phát hiện nếu không. Tôi đã kết thúc việc này:
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');
}
});
Lưu ý rằng đối với tất cả những điều trên tôi đang sử dụng subscribe
để nhận giá trị (như @Ben thảo luận). Không sử dụng một .value
tài sản, ngay cả khi tôi có một BehaviorSubject
.