Last active
August 29, 2015 14:03
-
-
Save getify/1e304ac35b090e8a437c to your computer and use it in GitHub Desktop.
reactive-sequences + generators
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var http = require("http"); | |
var ASQ = require("asynquence-contrib"); // bring in ASQ + optional contrib plugins | |
var server = http.createServer(); | |
server.listen(8000); | |
ASQ.react(function(next){ | |
server.on("request",next); | |
}) | |
.runner(function*(channel){ | |
var req = channel.messages.shift(); | |
var res = channel.messages.shift(); | |
var user_id = parseUserId(req.url); | |
var cart_id = parseCartId(req.url); | |
try { | |
// wait for all messages to resolve | |
var resp_data = yield ASQ().all( | |
// request all messages at once | |
getUserProfile(user_id), | |
getOrderHistory(user_id), | |
getShoppingCart(user_id,cart_id) | |
); | |
var status = yield sendResponse(res,resp_data); | |
} | |
catch (err) { | |
throw ASQ.messages(res,err); | |
} | |
yield registerStatus(user_id,status); | |
logStatus(status); | |
}) | |
.or(sendError); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var http = require("http"); | |
var ASQ = require("asynquence-contrib"); // bring in ASQ + optional contrib plugins | |
var server = http.createServer(); | |
server.listen(8000); | |
ASQ.react(function(next){ | |
server.on("request",next); | |
}) | |
.runner(function*(channel){ | |
var req = channel.messages.shift(); | |
var res = channel.messages.shift(); | |
var user_id = parseUserId(req.url); | |
var cart_id = parseCartId(req.url); | |
try { | |
// request all messages at once | |
var resp_data = [ | |
getUserProfile(user_id), | |
getOrderHistory(user_id), | |
getShoppingCart(user_id,cart_id) | |
]; | |
// wait for all messages to resolve | |
for (var i=0; i<resp_data.length; i++) { | |
resp_data.push( yield resp_data.shift() ); | |
} | |
var status = yield sendResponse(res,resp_data); | |
} | |
catch (err) { | |
throw ASQ.messages(res,err); | |
} | |
yield registerStatus(user_id,status); | |
logStatus(status); | |
}) | |
.or(sendError); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var http = require("http"); | |
var ASQ = require("asynquence-contrib"); // bring in ASQ + optional contrib plugins | |
var server = http.createServer(); | |
server.listen(8000); | |
ASQ.react(function(next){ | |
server.on("request",next); | |
}) | |
.runner( | |
function*(channel){ | |
var req = channel.messages.shift(); | |
var res = channel.messages.shift(); | |
var user_id = parseUserId(req.url); | |
var cart_id = parseCartId(req.url); | |
try { | |
// request all messages at once, then | |
// store message promises in channel | |
channel.messages.push( | |
getUserProfile(user_id).defer(), | |
getOrderHistory(user_id).defer(), | |
getShoppingCart(user_id,cart_id).defer() | |
); | |
// wait for all messages to resolve | |
yield channel; | |
var resp_data = channel.messages.slice(1); | |
var status = yield sendResponse(res,resp_data); | |
} | |
catch (err) { | |
throw ASQ.messages(res,err); | |
} | |
yield registerStatus(user_id,status); | |
logStatus(status); | |
}, | |
function*(channel){ | |
// get a copy of all messages from channel | |
var msgs = channel.messages.slice(); | |
// empty channel messages | |
channel.messages = []; | |
do { | |
yield* (function*(){ | |
var idx = msgs.length; | |
// wait for message to complete (or error out), | |
// then store completed message back in channel | |
channel.messages[idx-1] = yield msgs.pop(); | |
})(); | |
} while (msgs.length); | |
} | |
) | |
.or(sendError); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment