Javascript 如何避免使用RxJS的长if-else语句

Javascript 如何避免使用RxJS的长if-else语句,javascript,if-statement,rxjs,rxjs5,Javascript,If Statement,Rxjs,Rxjs5,我正在尝试使用RxJS替换下一段代码() 我可以使用RxJS()实现这一点,但在这种情况下,我需要调用两次“过滤器表达式”为真的函数 RxJS能满足我的要求吗?我认为RxJS不是适合这份工作的工具。它最适合处理异步数据流。我认为更好的方法是将所有的测试函数放在一个数组中,然后在它们上面循环。大概是这样的: const tests=[testThatUrlIsOrigin1,testThatUrlIsOrigin2,testThatUrlIsOrigin3]; 函数parseRequestUrl

我正在尝试使用RxJS替换下一段代码()

我可以使用RxJS()实现这一点,但在这种情况下,我需要调用两次“过滤器表达式”为真的函数


RxJS能满足我的要求吗?

我认为RxJS不是适合这份工作的工具。它最适合处理异步数据流。我认为更好的方法是将所有的测试函数放在一个数组中,然后在它们上面循环。大概是这样的:

const tests=[testThatUrlIsOrigin1,testThatUrlIsOrigin2,testThatUrlIsOrigin3];
函数parseRequestUrl(url){
用于(测试的常数测试){
const newUrl=测试(url);
如果(newUrl==url)继续;
返回newUrl;
}
}
函数testThatUrlIsOrigin1(url){
log(“try testThatUrlIsOrigin1”);
如果(url=='origin1'){
log(“通过testThatUrlIsOrigin1”);
返回“第一个如果”;
}
返回url;
}
函数testThatUrlIsOrigin2(url){
log(“try testThatUrlIsOrigin2”);
如果(url=='origin2'){
log(“通过testThatUrlIsOrigin2”);
返回“第二个如果”;
}
返回url;
}
函数testThatUrlIsOrigin3(url){
log(“try testThatUrlIsOrigin3”);
如果(url=='origin3'){
log(“通过testThatUrlIsOrigin3”);
返回“第三个如果”;
}
返回url;
}

parseRequestUrl('origin2')
我认为RxJs不是适合这项工作的工具。它最适合处理异步数据流。我认为更好的方法是将所有的测试函数放在一个数组中,然后在它们上面循环。大概是这样的:

const tests=[testThatUrlIsOrigin1,testThatUrlIsOrigin2,testThatUrlIsOrigin3];
函数parseRequestUrl(url){
用于(测试的常数测试){
const newUrl=测试(url);
如果(newUrl==url)继续;
返回newUrl;
}
}
函数testThatUrlIsOrigin1(url){
log(“try testThatUrlIsOrigin1”);
如果(url=='origin1'){
log(“通过testThatUrlIsOrigin1”);
返回“第一个如果”;
}
返回url;
}
函数testThatUrlIsOrigin2(url){
log(“try testThatUrlIsOrigin2”);
如果(url=='origin2'){
log(“通过testThatUrlIsOrigin2”);
返回“第二个如果”;
}
返回url;
}
函数testThatUrlIsOrigin3(url){
log(“try testThatUrlIsOrigin3”);
如果(url=='origin3'){
log(“通过testThatUrlIsOrigin3”);
返回“第三个如果”;
}
返回url;
}

parseRequestUrl('origin2')
引用Ben Lesh(RxJS项目负责人)
不要尝试RxJS一切
。引用Ben Lesh(RxJS项目负责人)
不要尝试RxJS一切
。感谢回复。也许我的例子并不能解释我想要理解的东西。例如,我们有一个接一个的函数链,每个函数应该决定是继续还是中断,并且我们应该能够从最后执行的这个链中得到结果function@nikolayandr我相信这段代码和您描述的一样。它沿着函数链(数组)向下运行,并对每个函数进行求值。如果失败,它将继续沿着链向下运行,但如果通过,它将返回结果。我假设你的函数是预定义的,对吗?对。是的,我同意在这种情况下,使用你的建议就足够了。但我真正感兴趣的是获得如何为上述案例实施链的信息。如果你能帮忙,那就太酷了。花了4个小时,还是被卡住了:)@nikolayandr OK。为了满足您的好奇心,我添加了一个RxJs示例:)谢谢您的回复。也许我的例子并不能解释我想要理解的东西。例如,我们有一个接一个的函数链,每个函数应该决定是继续还是中断,并且我们应该能够从最后执行的这个链中得到结果function@nikolayandr我相信这段代码和您描述的一样。它沿着函数链(数组)向下运行,并对每个函数进行求值。如果失败,它将继续沿着链向下运行,但如果通过,它将返回结果。我假设你的函数是预定义的,对吗?对。是的,我同意在这种情况下,使用你的建议就足够了。但我真正感兴趣的是获得如何为上述案例实施链的信息。如果你能帮忙,那就太酷了。花了4个小时,还是被卡住了:)@nikolayandr OK。为了满足您的好奇心,我添加了一个RxJs示例:)
function parseRequestUrl(url) {
  var newUrl;
  if ((newUrl = testThatUrlIsOrigin1(url)) !== url) {
    return doSomething(newUrl);
  }
  if ((newUrl = testThatUrlIsOrigin2(url)) !== url) {
    return doSomething(newUrl);
  }
  if ((newUrl = testThatUrlIsOrigin3(url)) !== url) {
    return doSomething(newUrl);
  }
}
function parseRequestUrl(url) {
  var newUrl = url;
  var observer = Rx.Observable.of(testThatUrlIsOrigin1, testThatUrlIsOrigin2, testThatUrlIsOrigin3);
  observer.first(getUrlFunc => getUrlFunc(url) !== url).map(getUrlFunc => getUrlFunc(url)).subscribe(createdUrl => newUrl = createdUrl)

  return doSomething(newUrl);
  // And so on
}