Rx.JS中的映射序列

时间:2017-02-01 12:51:44

标签: javascript rxjs

我想使用Rx.js映射正确的序列。 最简单的例子是使用键盘。我将Rx.js附加到键盘事件并等待三个A,无论它们之间是什么,除了Q.当序列匹配时,我想在控制台上打印OK。 例如:

  • AAA - >应该打印好了
  • AsssAqweA - >应该打印好了
  • AAQAAQ - >不应该打印任何东西
  • AAQAAA - >应该打印好了
  • AAAsssAAAsssAAA - >应打印三次OK

我应该使用过滤功能并保持状态吗?或者有一种更为有效的方法。

2 个答案:

答案 0 :(得分:3)

您应该可以使用filterscan运算符来执行您想要的操作:

Rx.Observable.from("AsssAqweAbAAQAAA")

  // Only A and Q characters are important:

  .filter(char => (char === "A") || (char === "Q"))

  // Accumulate the A characters until there are three
  // or until a Q is received:

  .scan((acc, char) => {
    if ((char === "Q") || (acc.length === 3)) {
      acc = [];
    }
    if (char === "A") {
      acc.push(char);
    }    
    return acc;
  }, [])

  // Filter the accumulated characters until there
  // are three:

  .filter(acc => acc.length === 3)
  .mapTo("OK")
  .subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>

答案 1 :(得分:1)

您可以使用JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("document.getElementById('ITEM_SMOOTHING_DEFAULT-value').blur();"); executor.executeScript("document.getElementById('ITEM_SMOOTHING_DEFAULT-value').focus();"); WebElement toolTipElement = driver.findElement(By.className("tooltip")); 进行尝试 - 但我不确定您的示例是否已经简化,实际上有点复杂,但这可能会有所帮助:

&#13;
&#13;
bufferCount
&#13;
const source$ = Rx.Observable.from("aaqassaaassaaa");
source$.bufferCount(3, 1)
  // .do(console.log) // uncomment to see the processed data
  .filter(data => data.join("") === "aaa") // your detection-logic
  .mapTo("Ok")
  .subscribe(console.log);
&#13;
&#13;
&#13;