[英]how can i get last value from a Observable?
我試圖從可觀察到的最后一個值。 示例代碼是
// RxJS v6+
import { lastValueFrom, Subject } from 'rxjs';
import { scan } from 'rxjs/operators';
async function main() {
const subject = new Subject();
const example = subject.pipe(
scan((acc, curr) => {
return Object.assign({}, acc, curr);
}, {}),
);
const subscribe = example.subscribe((val) =>
console.log('Accumulated object:', val),
);
subject.next({ name: 'Joe' });
subject.next({ age: 30 });
subject.next({ favoriteLanguage: 'JavaScript' });
console.log('+++++++++++++');
const resp = await lastValueFrom(example);
console.log(resp);
console.log('end');
}
main()
.catch((e) => {
console.error(e);
})
.finally(async () => {
console.log('final');
});
輸出是
➜ npns-service git:(mr/master/658) ✗ ts-node prisma/test.ts
Accumulated object: { name: 'Joe' }
Accumulated object: { name: 'Joe', age: 30 }
Accumulated object: { name: 'Joe', age: 30, favoriteLanguage: 'JavaScript' }
+++++++++++++
我無法得到相應的輸出消息。
我如何從示例 Observable 中獲得 resp 值?
更新您的代碼以完成您的 observable:
setTimeout(() => { // setTimeout is just a simple way to use JS's event loop
subject.next({ name: 'Joe' });
subject.next({ age: 30 });
subject.next({ favoriteLanguage: 'JavaScript' });
subject.complete(); // signal that our observable is done emitting
// subject.next(something) here would do
// nothing, the observable is complete
}, 0);
console.log('+++++++++++++');
const resp = await lastValueFrom(example);
console.log(resp);
console.log('end');
如果你沒有完成一個 observable,就你的運行時所知,它可能仍會在一分鍾、5 小時、明年發出其他東西——誰知道呢? 必須有一些條件觸發完成。
順便說一句:我將在您的主題上發出的代碼放入事件循環中,以便后面的代碼可以await
它。 否則,您的主題將在該代碼運行之前同步完成。
將example
作為一個可觀察的對象,它可以記住(緩沖)最后一次發射。 然后只需使用take(1)
讀取緩沖值。
const subject = new Subject();
const example = subject.pipe(
scan((acc, curr) => Object.assign({}, acc, curr), {}),
shareReplay(1)
);
example.subscribe(val =>
console.log('Accumulated object:', val)
);
subject.next({ name: 'Joe' });
subject.next({ age: 30 });
subject.next({ favoriteLanguage: 'JavaScript' });
console.log('+++++++++++++');
const resp = await lastValueFrom(example.pipe(take(1));
console.log(resp);
console.log('end');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.