How to organise promises in for loop and pass argument between functions in javascript? -


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 getmyid not ever resolved or rejected.
  • getmyid.then won't work, because getmyid function, not promise. perhaps mean getmyid().then(...)
  • the callback has call /me/events should return promise asynchronous. is, kick off call facebook api , go next then handler after.
  • same final then handler.
  • you ought put catch @ end catches errors.
  • typo have retuen instead of return.

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