jspipe
Version:
JS/Pipe - coordinating asynchronous code without callbacks or chained functions
110 lines (91 loc) • 3.38 kB
JavaScript
function main(Pipe, job, listen, pace) {
wrapGenerator.mark(getUserSearchInput);
wrapGenerator.mark(displaySearchResults);
wrapGenerator.mark(search);
var input = document.getElementById('searchtext'),
results = document.getElementById('results'),
wikipediaUrl = 'http://en.wikipedia.org/w/api.php?action=opensearch&format=json&callback=?&search=',
searchRequestPipe = new Pipe(),
searchResultsPipe = new Pipe();
job(search, [searchRequestPipe, searchResultsPipe]);
job(displaySearchResults, [searchResultsPipe]);
job(getUserSearchInput, [searchRequestPipe]);
function search(requestPipe, resultPipe) {
var searchTerm, httpRequest;
return wrapGenerator(function search$($ctx) {
while (1) switch ($ctx.next) {
case 0:
$ctx.next = 2;
return requestPipe.get();
case 2:
if (!(searchTerm = $ctx.sent)) {
$ctx.next = 7;
break;
}
httpRequest && httpRequest.abort();
httpRequest = $.getJSON(wikipediaUrl + encodeURIComponent(searchTerm),
resultPipe.send.bind(resultPipe));
$ctx.next = 0;
break;
case 7:
case "end":
return $ctx.stop();
}
}, this);
}
function displaySearchResults(resultPipe) {
var res, lines;
return wrapGenerator(function displaySearchResults$($ctx) {
while (1) switch ($ctx.next) {
case 0:
$ctx.next = 2;
return resultPipe.get();
case 2:
if (!(res = $ctx.sent)) {
$ctx.next = 7;
break;
}
lines = res.error && ['<h1>' + res.error + '</h1>'] || res[0] && res[1];
results.innerHTML = lines.map(function(line) {
return '<p>' + line + '</p>';
}).join('');
$ctx.next = 0;
break;
case 7:
case "end":
return $ctx.stop();
}
}, this);
}
function getUserSearchInput(requestPipe) {
var pacedKeyup, evt, text, previousText, minLength;
return wrapGenerator(function getUserSearchInput$($ctx) {
while (1) switch ($ctx.next) {
case 0:
pacedKeyup = pace(300, listen(input, 'keyup'));
case 1:
$ctx.next = 3;
return pacedKeyup.get();
case 3:
if (!(evt = $ctx.sent)) {
$ctx.next = 10;
break;
}
text = evt.target.value;
minLength = text.length > 2;
if (minLength && text !== previousText) {
requestPipe.send(text);
} else if (!minLength) {
results.innerHTML = '';
}
previousText = text;
$ctx.next = 1;
break;
case 10:
case "end":
return $ctx.stop();
}
}, this);
}
};
main(JSPipe.Pipe, JSPipe.job, JSPipe.listen, JSPipe.pace);