Javascript RxJs:只有经过一段时间后才有新值
我是新来的反应性扩展,我没有去s.th工作。我认为这应该是一个非常常见的用例。我只想在一段特定的时间后收到一个新值,而没有新的下一个值。在下面的示例中,此时间段为1秒。这似乎正是我想要的。但是我没有让它工作Javascript RxJs:只有经过一段时间后才有新值,javascript,rxjs,rxjs5,reactive-extensions-js,Javascript,Rxjs,Rxjs5,Reactive Extensions Js,我是新来的反应性扩展,我没有去s.th工作。我认为这应该是一个非常常见的用例。我只想在一段特定的时间后收到一个新值,而没有新的下一个值。在下面的示例中,此时间段为1秒。这似乎正是我想要的。但是我没有让它工作 const observable$ = new Rx.Observable(observer => { observer.next('start'); setTimeout(() => { observer.next(1); }, 100); setTimeout
const observable$ = new Rx.Observable(observer => {
observer.next('start');
setTimeout(() => {
observer.next(1);
}, 100);
setTimeout(() => {
observer.next(2);
}, 200);
setTimeout(() => {
observer.next(3);
}, 300);
setTimeout(() => {
observer.next(4);
}, 400);
setTimeout(() => {
observer.next('end');
}, 1500);
});
let sub = observable$
.debounce(1000) //debounce(1000, null) does not work either
.take(100)
.subscribe(data => {
console.log(data);
},
err => console.log(err.message),
complete => console.log('Observable completed')
)
我希望得到的是控制台输出仅为:
"start"
"end"
在我的IDE(Webstorm)中,上面的代码甚至没有编译,尽管文档说明第二个参数是可选的。在上一节课上,我得到了以下错误:“this.durationSelector.call不是一个函数”(我承认,我还不知道如何在rxjs中应用调度程序)。在文档中,他们也只使用了一个数字。我在谷歌上找到的大多数debounce示例都只使用了一个数字,即这个数字。为什么这对我来说不起作用
谢谢你的帮助
附言:我使用RXJS5.0.0-beta.6
编辑:在这里的答案帮助下,我确实找到了我想要的实际解决方案:
const observable$ = new Rx.Observable(observer => {
observer.next('start');
setTimeout(() => {
observer.next(1);
}, 1100); //<-- If you change 1100 to i.e. 900 you just get "end" in the output, because there is no 1s periode during which no new value arrives.
setTimeout(() => {
observer.next(2);
}, 1200);
setTimeout(() => {
observer.next(3);
}, 1300);
setTimeout(() => {
observer.next(4);
}, 1400);
setTimeout(() => {
observer.next(5);
}, 1500);
setTimeout(() => {
observer.next('end');
}, 1501);
});
let sub = observable$
.debounceTime(1000)
.take(10)
.subscribe(data => {
console.log(data);
},
err => console.log(err.message),
complete => console.log('Observable completed')
);
const observable$=新接收可观测(observable=>{
下一步(“开始”);
设置超时(()=>{
观察员:下一(1);
}, 1100); // {
观察员:下一个(2);
}, 1200);
设置超时(()=>{
观察员:下一个(3);
}, 1300);
设置超时(()=>{
观察员:下一个(4);
}, 1400);
设置超时(()=>{
观察员:下一个(5);
}, 1500);
设置超时(()=>{
下一步(“结束”);
}, 1501);
});
设sub=可观测$
.debounceTime(1000)
.take(10)
.订阅(数据=>{
控制台日志(数据);
},
err=>console.log(err.message),
complete=>console.log('Observable completed')
);
您可以这样做
const observable$ = new Rx.Observable(observer => {
observer.next('start');
setTimeout(() => {
observer.next(1);
}, 100);
setTimeout(() => {
observer.next(2);
}, 200);
setTimeout(() => {
observer.next(3);
}, 300);
setTimeout(() => {
observer.next(4);
}, 400);
setTimeout(() => {
observer.next('end');
}, 1500);
});
let sub = observable$
.map(function(x, i) {
return {
val: x,
index: i
};
})
.debounce(function(obj) {
let interval = obj.index === 0 ? 0 : 1500;
return Rx.Observable.timer(interval);
})
.take(100)
.subscribe(data => {
console.log(data.val);
},
err => console.log(err.message),
complete => console.log('Observable completed')
)
这里的关键是使用
map
函数获取元素的索引,然后确定等待时间间隔。这只是旧版本RxJS的文档问题。重载去盎司
但是,将操作符拆分,这样实际上有两个操作符,一个使用选择器函数确定去盎司长度,另一个接受时间
因此,您的流成为:
let sub = observable$
.debounceTime(1000) //debounce(1000, null) does not work either
.take(100)
.subscribe(data => {
console.log(data);
},
err => console.log(err.message),
complete => console.log('Observable completed')
)
嗨,谢谢你的回答。你的解决方案确实有效,我想我现在对去盎司算子的理解稍微好一点了。谢谢!然而,在理解你的答案的过程中,我意识到我最初的例子有一个缺陷,所以我将在今天晚些时候编辑我的问题。我没有意识到文档是针对旧版本的。去BounceTime操作符似乎就在这里。谢谢!