为清楚起见,这个问题适用于在javascript中实现的可观察模式(我在这里写的代码都是ES6)。
最近我一直想弄清楚观察者的实际工作方式。我在创建一个以函数作为构造函数参数的类的上下文中找到了几篇文章/帖子来描述它们。这个函数只是等待一个观察者,方法.subscribe(observer)
最终以观察者为参数触发这个函数。
这是我尝试使用类语法创建一个observable,它实现了一个间隔时间限制的间隔(以便有一些东西可以完成):
class Observable {
constructor(pushFn) {
this.pushFn = pushFn; // waits for observer as argument
}
static interval(milliSecs, tickLimit) {
return new Observable(observer => {
if (milliSecs <= 0) {
observer.error("Invalid interval. Interval value must be larger than 0.")
} else {
let tick = 0;
const inter = setInterval(() => {
observer.next(tick += 1);
if (tick === tickLimit) {
clearInterval(inter);
observer.complete(tickLimit);
}
}, milliSecs);
}
});
}
subscribe(observer) {
return this.pushFn(observer);
}
}
我觉得有点令人惊讶(鉴于我一直认为可观察的东西是某种神秘的超级复杂的东西)是这个功能可以用以下功能复制:
const observableIntervalOf = (milliSecs, tickLimit) => observer => {
if (milliSecs <= 0) {
observer.error("Invalid interval. Interval value must be larger than 0.")
} else {
let tick = 0;
const inter = setInterval(() => {
observer.next(tick += 1);
if (tick === tickLimit) {
clearInterval(inter);
observer.complete(tickLimit);
}
}, milliSecs);
}
};
然后,以下各项的效果是相同的:
Observable.interval(1000, 5).subscribe(someObserver);
const fiveSeconds = observableIntervalOf(1000, 5);
fiveSeconds(someObserver);
我是否正确地认为将可观测量视为部分应用函数?是否存在不是这种情况的情况?