Javascript RxJS distinctUntilChanged多次发出相同的值

Javascript RxJS distinctUntilChanged多次发出相同的值,javascript,rxjs,Javascript,Rxjs,你们能告诉我这里怎么了吗 RxJS 我希望该值只打印一次,但它正在打印多次 任何时候您keyup都可以运行功能Search(sel) 每当您运行函数Search(sel)时,您都会创建一个可观察对象并订阅它 因此,在nkeyup事件之后,您最终拥有n对n不同源观测值的活动订阅,因此您可以看到控制台上记录的行的重复 如果更改html代码,如 <body onload="Search(this)"> Global Search <input id="iCard" type=

你们能告诉我这里怎么了吗

RxJS

我希望该值只打印一次,但它正在打印多次


任何时候您
keyup
都可以运行功能
Search(sel)

每当您运行函数
Search(sel)
时,您都会创建一个可观察对象并订阅它

因此,在n
keyup
事件之后,您最终拥有nn不同源观测值的活动订阅,因此您可以看到控制台上记录的行的重复

如果更改html代码,如

<body onload="Search(this)"> 

Global Search
<input id="iCard" type='text' />

</body>body>

全局搜索
正文>
你应该有正确的行为。
根据您的风格,将
搜索功能的名称更改为与实际执行的内容更一致的名称,例如
createInputObs

任何时候运行
搜索(sel)

每当您运行函数
Search(sel)
时,您都会创建一个可观察对象并订阅它

因此,在n
keyup
事件之后,您最终拥有nn不同源观测值的活动订阅,因此您可以看到控制台上记录的行的重复

如果更改html代码,如

<body onload="Search(this)"> 

Global Search
<input id="iCard" type='text' />

</body>body>

全局搜索
正文>
你应该有正确的行为。
根据您的风格,将“搜索”功能的名称更改为更符合实际执行内容的名称,例如“创建输入按钮”。

用小提琴更改了您的代码。您不需要在每个
keyup
上订阅
input
事件。而
distinctUntilChanged
得到的事件对象总是不同的。所以它什么也做不了。在此之前,事件应该映射到文本,然后可以在
distinctunitrichanged
中对其进行比较

Rx.Observable.fromEvent(document.getElementById('iCard'), 'input')
  .debounceTime(1000)
  .map(e => e.target.value)
  .distinctUntilChanged()
  .subscribe({
    next: callGlobalSearch
  });

function callGlobalSearch(text) {
  console.log('VALUE : ', text);
}

在fiddle中更改了您的代码。您不需要在每个
keyup
上订阅
input
事件。而
distinctUntilChanged
得到的事件对象总是不同的。所以它什么也做不了。在此之前,事件应该映射到文本,然后可以在
distinctunitrichanged
中对其进行比较

Rx.Observable.fromEvent(document.getElementById('iCard'), 'input')
  .debounceTime(1000)
  .map(e => e.target.value)
  .distinctUntilChanged()
  .subscribe({
    next: callGlobalSearch
  });

function callGlobalSearch(text) {
  console.log('VALUE : ', text);
}

呵呵,你纠正了我,你能告诉我我应该用什么事件来代替键盘吗呵呵,你纠正了我,你能告诉我我应该用什么事件来代替键盘吗这是正确的答案。。。distinctUntilChanged相等性检查发生在事件对象上,该对象每次都是一个新实例。在e.target.value上放置一个映射将对字符串值进行相等比较,这是您想要的。这是正确的答案。。。distinctUntilChanged相等性检查发生在事件对象上,该对象每次都是一个新实例。在e.target.value上放置一个映射将对字符串值进行相等比较,这是您想要的。