Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJs:只有经过一段时间后才有新值_Javascript_Rxjs_Rxjs5_Reactive Extensions Js - Fatal编程技术网

Javascript RxJs:只有经过一段时间后才有新值

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

我是新来的反应性扩展,我没有去s.th工作。我认为这应该是一个非常常见的用例。我只想在一段特定的时间后收到一个新值,而没有新的下一个值。在下面的示例中,此时间段为1秒。这似乎正是我想要的。但是我没有让它工作

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操作符似乎就在这里。谢谢!