Javascript Rxjs使用Observable.from()字符串并防止多次创建Observable

Javascript Rxjs使用Observable.from()字符串并防止多次创建Observable,javascript,rxjs,observable,Javascript,Rxjs,Observable,我有一个函数,我试图阻止每次调用这个函数时都创建Observable。基本上,每次用户在搜索字段中键入内容时都会调用此函数。我知道我可以从事件中创建可观察的作为可观察的。fromEvent('按钮',单击),但这需要我对应用程序进行大量更改。感谢您的帮助 function search(input) { Observable.from([input]) .map(value => value) .filter(value => value.length >3)

我有一个函数,我试图阻止每次调用这个函数时都创建Observable。基本上,每次用户在搜索字段中键入内容时都会调用此函数。我知道我可以从事件中创建可观察的作为可观察的。fromEvent('按钮',单击),但这需要我对应用程序进行大量更改。感谢您的帮助

function search(input) { 
  Observable.from([input])
  .map(value => value)
  .filter(value => value.length >3)
  .debounceTime(300)
  .distinctUntilChanged()
  .switchMap(searchValue => { 
    //ajax call 
    return Promise.resolve(data) 
  }) 
  .subscribe(data => {
    //Do something with the data
  })
}

如果您想使用可观察对象,但不想从事件中创建一个,您可以创建一个
主题
,并可以从
搜索中调用其
下一个
方法:

import { Subject } from 'rxjs/Subject';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/switchMap';

var searchSubject = new Subject();
  .filter(value => value.length > 3)
  .debounceTime(300)
  .distinctUntilChanged()
  .switchMap(searchValue => { 
    // ajax call
    return Promise.resolve(data) 
  }) 
  .subscribe(data => {
    // Do something with the data
  });

function search(input) { 
  searchSubject.next(input);
}

我喜欢这个想法,但一旦我在主题中添加了
map
filter
等,我就无法在下面的
subscribe
中获得流。我不确定我是否遵循了,但我已经在答案中添加了所需的导入,以防出现问题。另外,
map
是多余的-它什么也没做-我没怎么注意,我只是复制了你的合成观测值。是的,它现在工作了。我忘了导入
过滤器
去BounceTime
等。谢谢你的帮助。我也不明白
可观察的
主题
之间的区别。这里有一篇很好的文章详细解释了这一点。