i trying implement first promise in javascript. have these function. each 1 of function must completed go next step:
f1 --> current user id , save var "myuserid" f2 --> getuserevent (example 10 events) go loop each event , each iteration save value var "eventid" f3--> info specific event facebook function has 2 parameters (myuserid,eventid) f4--> image specific event function has 1 parameter (eventid) f5--> save info db go loop to implement this, have done following know not working. appreciate if experience of promises can show prototype me. not sure how pass arguments between functions:
var getmyid = function() { return new promise(function(resolve, reject) { // id facebook fb.api('/me', function(response) { if (response && !response.error) { console.log("response== "+ json.stringify(response)); retuen(response.id);//myuserid } }); }); }; getmyid.then(function(myid) { fb.api('/me/events', function(response) { console.log("response== "+ json.stringify(response)); for(i=0; i<response.data.length;i++) { console.log("eventid= "+response.data[i].id); getevent(response.data[i].id,myid); } }); }).catch(function(error) { console.log('oh no', error); }).then(function(eventid,myid) { fb.api("/"+ eventid , function (response3) { if (response3 && !response3.error) { //.... if(myid == response3.owner.id && diff < 0 ) { //save db -- place need add promise } } }); });
i see following bugs:
- the promise returned
getmyidnot ever resolved or rejected. getmyid.thenwon't work, becausegetmyidfunction, notpromise. perhaps meangetmyid().then(...)- the callback has call
/me/eventsshould returnpromiseasynchronous. is, kick off call facebook api , go nextthenhandler after. - same final
thenhandler. - you ought put
catch@ end catches errors. - typo have
retueninstead ofreturn.
for sake of dry, i'd recommend create promise-returning wrapper around facebook api. this:
function fbapirequest(url) { return new promise(function (resolve, reject) { fb.api(url, function(response) { if (response && !response.error) { resolve(response); } else { reject(response); } }); }; } this make code bit easier:
var myuserid; fbapirequest('/me') .then(function (response) { myuserid = response.id; return fbapirequest('/me/events'); }) .then(function (response) { var eventpromises = response.data.map(function (data) { return getevent(data.id, myuserid); }); return promise.all(eventpromises); }) .catch(function(error) { console.log('oh no', error); }); function getevent(eventid, userid) { return fbapirequest('/' + eventid) .then(function (response) { if (response.owner.id === userid && diff < 0) { return savetodb(response); } }); } function savetodb(event) { return new promise(...); } you'll notice passed data among callbacks either returning values (this becomes value consumed next callback in chain), returning promises resolve values, or utilizing closures (like setting myuserid variable).
Comments
Post a Comment