Skip to content

Instantly share code, notes, and snippets.

@cdimascio
Last active January 1, 2016 23:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cdimascio/1572f3e5f83a6aae1190 to your computer and use it in GitHub Desktop.
Save cdimascio/1572f3e5f83a6aae1190 to your computer and use it in GitHub Desktop.
RxJS - Simple autocomplete box
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<input id="textbox">
<div id="results"></div>
</body>
</html>
var Observable = Rx.Observable;
var textbox = $('#textbox');
var results = $('#results');
var keyPresses = Observable.fromEvent(textbox, 'keyup');
var searchResultSet = keyPresses.
throttle(20).
map(key => textbox.val()).
distinctUntilChanged().
map(search => getWikipediaSearchResults(search).retry(3)).
switchLatest();
searchResultSet.forEach(
r => {
results.empty();
results.append(r.join('<br>'));
},
err => {
results.empty();
results.append(err);
});
// Convert getJSON request to Wikipedia into an Observable
function getWikipediaSearchResults(term) {
return Observable.create(function forEach(observer) {
var canceled = false;
var url = 'https://en.wikipedia.org/w/api.php?action=opensearch&format=json&search=' +
encodeURIComponent(term) + '&callback=?';
if (!canceled) {
$.getJSON(url).done(data => {
observer.onNext(data[1]);
observer.onCompleted();
});
}
return function dispose() {
canceled = true;
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment