Message from discussion
Handling async requests. How?
Date: Wed, 16 May 2012 13:17:11 -0700 (PDT)
From: Ronnie Paskin <rpas...@gmail.com>
To: futures-javascript@googlegroups.com
Message-ID: <916981.2401.1337199431755.JavaMail.geo-discussion-forums@ynjb19>
Subject: Handling async requests. How?
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_2399_25587887.1337199431753"
------=_Part_2399_25587887.1337199431753
Content-Type: multipart/alternative;
boundary="----=_Part_2400_22020961.1337199431753"
------=_Part_2400_22020961.1337199431753
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Hi,
Sorry for the noob question, but I'm trying to wrap my head around using
the futures library and I'm getting some strange behavior.
In a nutshell, I want to be able to:
1. Issue several asynchronous requests in parallel
2. When all of these are done, run a modifier on all the result sets
3. When the modifier is done, return the result
Here's something that (kind of) worked (note that of course <my local
server> is a real working server url):
app.get("/futures", function(req, res){
var count = 0,
timers = [
5000,
5011,
10000
];
forEachAsync(timers, function (next, time) {
console.log('Requesting ',time, '>>>>>>>>>>>>>>>>>>>>>>>');
setTimeout(function(){
request('<my localserver went here>/?t='+time, function(){
console.log(count += 1, time);
console.log('Done! ',time, '<<<<<<<<<<<<<<<<<');
if (count == timers.length){
console.log("=============== ALL CALLBACKS DONE
==============");
res.send("All Done ==============");
}
})
}, time);
next();
}).then(function () {
console.log('Loop done ======');
});
});
But it doesn't seem very clean.
I tried to use chanify, like so:
function doAsyncRequest (time, p){
console.log('Setting timeout! ',time, '.........');
setTimeout(function(){
console.log('Requesting ',time, '>>>>>>>>>>>>>>>>>');
request('<my local server>/?t='+time, function(){
console.log('Done! ',time, '<<<<<<<<<<<<<<<<<');
p.fulfill();
})
}, time);
}
app.get("/chainify", function(req, res){
var Contacts,
providers,
modifiers,
consumers;
providers = {
all: function(params) {
var p = Futures.promise();
doAsyncRequest (5000, p);
return p.passable();
},
one: function(id, params) {
var p = Futures.promise();
doAsyncRequest (7000, p);
return p.passable();
},
two: function(id, params) {
var p = Futures.promise();
doAsyncRequest (7011, p);
return p.passable();
}
}
modifiers = {};
consumers = {
display: function (data, params) {
console.log(data, params);
res.send("All Done?");
}
};
console.log(178);
Contacts = Futures.chainify(providers, modifiers, consumers);
console.log(180,Contacts);
Contacts.all().display();
console.log(182);
}
But I get:
Error: You have upgraded to Futures 2.x. See http://github.com/coolaj86/futures for details.
at Object.upgradeMessage...
...
I'm sure I'm just doing something silly, but it feels like hitting my head
against the wall. Any tips? What would be the cleanest, recommended,
implementation for something basic like that?
thanks in advance,
Ronnie
------=_Part_2400_22020961.1337199431753
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Hi,<div><br></div><div>Sorry for the noob question, but I'm trying to wrap =
my head around using the futures library and I'm getting some strange behav=
ior.</div><div><br></div><div>In a nutshell, I want to be able to:</div><di=
v>1. Issue several asynchronous requests in parallel</div><div>2. When all =
of these are done, run a modifier on all the result sets</div><div>3. When =
the modifier is done, return the result</div><div><br></div><div>Here's som=
ething that (kind of) worked (note that of course <my local server> i=
s a real working server url):</div><div><br></div><div><font face=3D"courie=
r new, monospace"> app.get("/futures", function(req, res){<br></font><=
/div><div><font face=3D"courier new, monospace"><br></font></div><div><font=
face=3D"courier new, monospace"> var count =3D 0,</font></div=
><div><font face=3D"courier new, monospace"> tim=
ers =3D [</font></div><div><font face=3D"courier new, monospace"> &nb=
sp; 5000,</font></div><div><font face=3D"courie=
r new, monospace"> 5011,</font></d=
iv><div><font face=3D"courier new, monospace"> &=
nbsp; 10000</font></div><div><font face=3D"courier new, monospace">&=
nbsp; ];</font></div><div><font face=3D"courier new, m=
onospace"><br></font></div><div><font face=3D"courier new, monospace"> =
; forEachAsync(timers, function (next, time) {<br></font></div><div>=
<font face=3D"courier new, monospace"><br></font></div><div><font face=3D"c=
ourier new, monospace"> console.log('Requesting =
',time, '>>>>>>>>>>>>>>>>&g=
t;>>>>>>');</font></div><div><font face=3D"courier new, m=
onospace"> setTimeout(function(){</font></div><d=
iv><font face=3D"courier new, monospace"> =
request('<my localserver went here>/?t=3D'+time, function(){<=
/font></div><div><font face=3D"courier new, monospace"> =
console.log(count +=3D 1, time);</font>=
</div><div><font face=3D"courier new, monospace">  =
; console.log('Done! ',time, '<<<<&=
lt;<<<<<<<<<<<<');</font></div><div><fo=
nt face=3D"courier new, monospace"><br></font></div><div><font face=3D"cour=
ier new, monospace"> =
if (count =3D=3D timers.length){</font></div><div><font face=3D"courier ne=
w, monospace">  =
; console.log("=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ALL CAL=
LBACKS DONE =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D");</font></div><div>=
<font face=3D"courier new, monospace"> &n=
bsp; res.send("All Done =3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D");</font></div><div><font face=3D"courier new, monosp=
ace"> }</font></div>=
<div><font face=3D"courier new, monospace"> &nbs=
p; })</font></div><div><font face=3D"courier new, monospace"> =
}, time);</font></div><div><font face=3D"courier new, =
monospace"><br></font></div><div><font face=3D"courier new, monospace">&nbs=
p; next();</font></div><div><font face=3D"courier new,=
monospace"> }).then(function () {</font></div><div><font face=
=3D"courier new, monospace"> console.log('Loop d=
one =3D=3D=3D=3D=3D=3D');</font></div><div><font face=3D"courier new, monos=
pace"> });<br></font></div><div><font face=3D"courier new, mon=
ospace"><br></font></div><div><font face=3D"courier new, monospace">});</fo=
nt></div><div><br></div><div><br></div><div>But it doesn't seem very clean.=
</div><div><br></div><div>I tried to use chanify, like so:</div><div><br></=
div><div><div><font face=3D"courier new, monospace">function doAsyncRequest=
(time, p){</font></div><div><font face=3D"courier new, monospace"> &=
nbsp; console.log('Setting timeout! ',time, '.........');</font></div><div>=
<font face=3D"courier new, monospace"> setTimeout(function(){<=
/font></div><div><font face=3D"courier new, monospace"> =
console.log('Requesting ',time, '>>>>>>>>&g=
t;>>>>>>>>');</font></div><div><font face=3D"courie=
r new, monospace"> request('<my local server&=
gt;/?t=3D'+time, function(){</font></div><div><font face=3D"courier new, mo=
nospace"> console.log('Done! ',tim=
e, '<<<<<<<<<<<<<<<<<');=
</font></div><div><font face=3D"courier new, monospace">  =
; p.fulfill();</font></div><div><font face=3D"courier =
new, monospace"> })</font></div><div><font face=
=3D"courier new, monospace"> }, time);</font></div><div><font =
face=3D"courier new, monospace">}</font></div></div><div><font face=3D"cour=
ier new, monospace"><br></font></div><div><div><font face=3D"courier new, m=
onospace">app.get("/chainify", function(req, res){</font></div><div><font f=
ace=3D"courier new, monospace"><br></font></div><div><font face=3D"courier =
new, monospace"> var Contacts,<br></font></div><div><font face=
=3D"courier new, monospace"> providers,</font></=
div><div><font face=3D"courier new, monospace"> =
modifiers,</font></div><div><font face=3D"courier new, monospace"> &n=
bsp; consumers;</font></div><div><font face=3D"courier new, m=
onospace"><br></font></div><div><font face=3D"courier new, monospace"> =
; providers =3D {</font></div><div><font face=3D"courier new, monosp=
ace"> all: function(params) {</font></div><div><=
font face=3D"courier new, monospace"> &nb=
sp; var p =3D Futures.promise();</font></div><div><font face=3D"courier new=
, monospace"> doAsyncRequest (5000=
, p);<br></font></div><div><font face=3D"courier new, monospace"> &nb=
sp; return p.passable();</font></div><div><font=
face=3D"courier new, monospace"> },</font></div=
><div><font face=3D"courier new, monospace"> one=
: function(id, params) {</font></div><div><font face=3D"courier new, monosp=
ace"> var p =3D Futures.promise();=
</font></div><div><font face=3D"courier new, monospace">  =
; doAsyncRequest (7000, p);<br></font></div><div><font=
face=3D"courier new, monospace"> =
return p.passable();</font></div><div><font face=3D"courier new, monospace"=
> },</font></div><div><font face=3D"courier new,=
monospace"> two: function(id, params) {</font><=
/div><div><font face=3D"courier new, monospace"> =
var p =3D Futures.promise();</font></div><div><font face=3D"=
courier new, monospace"> doAsyncRe=
quest (7011, p);<br></font></div><div><font face=3D"courier new, monospace"=
> return p.passable();</font></div=
><div><font face=3D"courier new, monospace"> }</=
font></div><div><font face=3D"courier new, monospace"> }</font=
></div><div><font face=3D"courier new, monospace"><br></font></div><div><fo=
nt face=3D"courier new, monospace"> modifiers =3D {};</font></=
div><div><font face=3D"courier new, monospace"><br></font></div><div><font =
face=3D"courier new, monospace"> consumers =3D {</font></div><=
div><font face=3D"courier new, monospace"> displ=
ay: function (data, params) {</font></div><div><font face=3D"courier new, m=
onospace"> console.log(data, param=
s);</font></div><div><font face=3D"courier new, monospace"> &n=
bsp; res.send("All Done?");</font></div><div><font fac=
e=3D"courier new, monospace"> }</font></div><div=
><font face=3D"courier new, monospace"> };</font></div><div><f=
ont face=3D"courier new, monospace"><br></font></div><div><font face=3D"cou=
rier new, monospace"> console.log(178);</font></div><div><font=
face=3D"courier new, monospace"> Contacts =3D Futures.chainif=
y(providers, modifiers, consumers);</font></div><div><font face=3D"courier =
new, monospace"> console.log(180,Contacts);</font></div><div><=
font face=3D"courier new, monospace"> Contacts.all().display()=
;</font></div><div><font face=3D"courier new, monospace"> cons=
ole.log(182);</font></div><div><font face=3D"courier new, monospace">}</fon=
t></div></div><div><br></div><div>But I get:</div><div><br></div><div><pre =
style=3D"color: rgb(0, 0, 0); word-wrap: break-word; white-space: pre-wrap;=
">Error: You have upgraded to Futures 2.x. See http://github.com/coolaj86/=
futures for details.
at Object.upgradeMessage...</pre><pre style=3D"color: rgb(0, 0, 0); wor=
d-wrap: break-word; white-space: pre-wrap; ">...</pre></div><div><br></div>=
<div>I'm sure I'm just doing something silly, but it feels like hitting my =
head against the wall. Any tips? What would be the cleanest, recommended, i=
mplementation for something basic like that?<br></div><div><br></div><div>t=
hanks in advance,</div><div>Ronnie</div>
------=_Part_2400_22020961.1337199431753--
------=_Part_2399_25587887.1337199431753--