AsyncSubject
最后,我们将看到另一个类型的 Subject -- AsyncSubject,观察了 AsyncSubject 的 Observer,只会在 AsyncSubject 完成时才能观测到值:
类型 | 特点 |
---|---|
ReplaySubject | 无论是否完成,能够重现指定数目的值 |
BehaviorSubject | 在完成前,总能够反映最后一次值 |
AsyncSubject | 在完成时,能够反映最后一次值 |
const subject = new Rx.BehaviorSubject(0);
const observerA = {
next: x => console.log(`A next ${x}`),
error: e => console.error(`A error ${e}`),
complete: () => console.log('A done')
};
subject.subscribe(observerA);
console.log('observerA subscribed');
const observerB = {
next: x => console.log(`B next ${x}`),
error: e => console.error(`B error ${e}`),
complete: () => console.log('B done')
};
setTimeout(() =>subject.next(1), 100);
setTimeout(() =>subject.next(2), 200);
setTimeout(() =>subject.next(3), 300);
setTimeout(() => {
subject.subscribe(observerB);
console.log('observerB subscribed');
}, 400);
/* 程序输出:
"observerA subscribed"
"A next 3"
"A done"
"B next 3"
"B done"
"observerB subscribed"
*/
AsyncSubject 就和他的名字一样,类似于同样用来处理异步任务的 Promise。在 Promise 中,我们可以通过 resolve(value)
声明任务完成,并将获得的值发送出去,然后再 Promise.then()
方法中处理得到的值。