Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
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 &lt;my local server&gt; i=
s a real working server url):</div><div><br></div><div><font face=3D"courie=
r new, monospace">&nbsp;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">&nbsp; &nbsp; var count =3D 0,</font></div=
><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; tim=
ers =3D [</font></div><div><font face=3D"courier new, monospace">&nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; &nbsp; 5000,</font></div><div><font face=3D"courie=
r new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5011,</font></d=
iv><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; 10000</font></div><div><font face=3D"courier new, monospace">&=
nbsp; &nbsp; &nbsp; &nbsp; ];</font></div><div><font face=3D"courier new, m=
onospace"><br></font></div><div><font face=3D"courier new, monospace">&nbsp=
; &nbsp; 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">&nbsp; &nbsp; &nbsp; &nbsp; console.log('Requesting =
',time, '&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&g=
t;&gt;&gt;&gt;&gt;&gt;&gt;');</font></div><div><font face=3D"courier new, m=
onospace">&nbsp; &nbsp; &nbsp; &nbsp; setTimeout(function(){</font></div><d=
iv><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=
 &nbsp; request('&lt;my localserver went here&gt;/?t=3D'+time, function(){<=
/font></div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp;=
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(count +=3D 1, time);</font>=
</div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; console.log('Done! ',time, '&lt;&lt;&lt;&lt;&=
lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;');</font></div><div><fo=
nt face=3D"courier new, monospace"><br></font></div><div><font face=3D"cour=
ier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=
 if (count =3D=3D timers.length){</font></div><div><font face=3D"courier ne=
w, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp; 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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp; &nbsp; 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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font></div>=
<div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp; })</font></div><div><font face=3D"courier new, monospace">&nbsp; =
&nbsp; &nbsp; &nbsp; }, time);</font></div><div><font face=3D"courier new, =
monospace"><br></font></div><div><font face=3D"courier new, monospace">&nbs=
p; &nbsp; &nbsp; &nbsp; next();</font></div><div><font face=3D"courier new,=
 monospace">&nbsp; &nbsp; }).then(function () {</font></div><div><font face=
=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; console.log('Loop d=
one =3D=3D=3D=3D=3D=3D');</font></div><div><font face=3D"courier new, monos=
pace">&nbsp; &nbsp; });<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; &=
nbsp; console.log('Setting timeout! ',time, '.........');</font></div><div>=
<font face=3D"courier new, monospace">&nbsp; &nbsp; setTimeout(function(){<=
/font></div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp;=
 &nbsp; console.log('Requesting ',time, '&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&g=
t;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;');</font></div><div><font face=3D"courie=
r new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; request('&lt;my local server&=
gt;/?t=3D'+time, function(){</font></div><div><font face=3D"courier new, mo=
nospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log('Done! ',tim=
e, '&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;');=
</font></div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; p.fulfill();</font></div><div><font face=3D"courier =
new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; })</font></div><div><font face=
=3D"courier new, monospace">&nbsp; &nbsp; }, 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">&nbsp; &nbsp; var Contacts,<br></font></div><div><font face=
=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; providers,</font></=
div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; =
modifiers,</font></div><div><font face=3D"courier new, monospace">&nbsp; &n=
bsp; &nbsp; &nbsp; consumers;</font></div><div><font face=3D"courier new, m=
onospace"><br></font></div><div><font face=3D"courier new, monospace">&nbsp=
; &nbsp; providers =3D {</font></div><div><font face=3D"courier new, monosp=
ace">&nbsp; &nbsp; &nbsp; &nbsp; all: function(params) {</font></div><div><=
font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; var p =3D Futures.promise();</font></div><div><font face=3D"courier new=
, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doAsyncRequest (5000=
, p);<br></font></div><div><font face=3D"courier new, monospace">&nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; &nbsp; return p.passable();</font></div><div><font=
 face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; },</font></div=
><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; one=
: function(id, params) {</font></div><div><font face=3D"courier new, monosp=
ace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var p =3D Futures.promise();=
</font></div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; doAsyncRequest (7000, p);<br></font></div><div><font=
 face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
return p.passable();</font></div><div><font face=3D"courier new, monospace"=
>&nbsp; &nbsp; &nbsp; &nbsp; },</font></div><div><font face=3D"courier new,=
 monospace">&nbsp; &nbsp; &nbsp; &nbsp; two: function(id, params) {</font><=
/div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp;=
 &nbsp; &nbsp; var p =3D Futures.promise();</font></div><div><font face=3D"=
courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doAsyncRe=
quest (7011, p);<br></font></div><div><font face=3D"courier new, monospace"=
>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return p.passable();</font></div=
><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; }</=
font></div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; }</font=
></div><div><font face=3D"courier new, monospace"><br></font></div><div><fo=
nt face=3D"courier new, monospace">&nbsp; &nbsp; modifiers =3D {};</font></=
div><div><font face=3D"courier new, monospace"><br></font></div><div><font =
face=3D"courier new, monospace">&nbsp; &nbsp; consumers =3D {</font></div><=
div><font face=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; displ=
ay: function (data, params) {</font></div><div><font face=3D"courier new, m=
onospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(data, param=
s);</font></div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp; res.send("All Done?");</font></div><div><font fac=
e=3D"courier new, monospace">&nbsp; &nbsp; &nbsp; &nbsp; }</font></div><div=
><font face=3D"courier new, monospace">&nbsp; &nbsp; };</font></div><div><f=
ont face=3D"courier new, monospace"><br></font></div><div><font face=3D"cou=
rier new, monospace">&nbsp; &nbsp; console.log(178);</font></div><div><font=
 face=3D"courier new, monospace">&nbsp; &nbsp; Contacts =3D Futures.chainif=
y(providers, modifiers, consumers);</font></div><div><font face=3D"courier =
new, monospace">&nbsp; &nbsp; console.log(180,Contacts);</font></div><div><=
font face=3D"courier new, monospace">&nbsp; &nbsp; Contacts.all().display()=
;</font></div><div><font face=3D"courier new, monospace">&nbsp; &nbsp; 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--