Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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_Node.js_Rxjs - Fatal编程技术网

Javascript RxJS根据发射值重复

Javascript RxJS根据发射值重复,javascript,node.js,rxjs,Javascript,Node.js,Rxjs,根据条件字段中返回的值,我正在尝试重复承诺调用。以下块不起作用,因为v未定义,并随机抛出TypeError:无法读取未定义的属性“condition” console.log的o/p是{Items:[1,2,3,4,5],条件:5,时间:1513827310333} 让它与一个外部标志一起工作,每个重复都会对源进行评估 const source=Rx.Observable.defer(()=> 承诺,决心({ 项目:[1,2,3,4,5], 条件:Math.floor(Math.random

根据
条件
字段中返回的值,我正在尝试
重复
承诺调用。以下块不起作用,因为
v
未定义,并随机抛出
TypeError:无法读取未定义的属性“condition”

console.log的o/p是
{Items:[1,2,3,4,5],条件:5,时间:1513827310333}


让它与一个外部标志一起工作,每个重复都会对源进行评估

const source=Rx.Observable.defer(()=>
承诺,决心({
项目:[1,2,3,4,5],
条件:Math.floor(Math.random()*10),
时间:+新日期()
})
);
让条件=假;
来源
.repeatWhen(通知=>{
返回通知
.scan(()=>{
返回条件;
},错)
.延迟(100)
.takeWhile(()=>{
返回条件;
});
})
.do(x=>(条件=x.condition!==0))
.finally(console.log(“完成”))
.subscribe(console.log)
。作为控制台包装{最大高度:100%!重要;顶部:0;}

您还可以使用
延迟
将外部状态更改为每个订阅状态:
const repeats=Rx.Observable.defer(()=>{let condition;source.do(value=>condition=value.condition!==0).repeatWhen(/*etc.*/);})最好避免外部状态。@cartant好主意。将对此进行测试并让您知道。在
源代码之前的上一条注释的代码中应该有一个
返回。然后执行
最后
上的
订阅
重复
可观察,等等。
const source = Rx.Observable.fromPromise(
  Promise.resolve({
    Items: [1, 2, 3, 4, 5],
    condition: Math.floor(Math.random() * 10),
    time: +new Date()
  })
);

source
  .map(val => val)
  .repeatWhen(val => {
    return val.map(v => { // v is undefined
      if (v.condition > 0) {
        return Rx.Observable.of(v);
      } else {
        return Rx.Observable.empty();
      }
    });
  })
  .finally(() => {
    done();
  })
  .subscribe(val => console.log(val));