2

I am trying to call a function and then return some data back in the returned parameter and I am using promises but I can not get my returned data back.

I have the calls here :

  fbUserInfo(recipientId,req).then(function(){
    getSessionData(FB_ID).then(function(rowsJson){
       console.log('%%%%%%%%' + JSON.stringify(rowsJson));
    })
  })

My functions are defined here

/*
*  FUNCTION: getSessionData
*  PURPOSE : Get the session data into global variables
*/
function getSessionData(FB_ID){

  var gender, user_name;

  var rowsJson = {'gender': gender, 'user_name': user_name };

  console.log('START to get client data');


  return new Promise((resolve,reject) => {

    client.hmget(FB_ID,'gender',function(err,reply){
        rowsJson.gender = reply;
        console.log('^^^ gender :' + rowsJson.gender);

    });
    client.hmget(FB_ID,'name',function(err,reply){
        rowsJson.user_name = reply;
        console.log('^^^ user_name :' + rowsJson.user_name);
    });



    resolve(rowsJson);

  }); // return


} // getSessionData


/*
*  FUNCTION: fbUserInfo
*  PURPOSE : Called once when displaying the user welcome message
*            to get the Facebook user details an place them in the 
*            session if they dont already exist
*/
function fbUserInfo(id,req) {

  return new Promise((resolve, reject) => {

    var url = 'https://graph.facebook.com/v2.6/' + id; 
    console.log('^^^^ url ' + url);

    const options = {  
     method: 'GET',
    uri: url,
    qs: {
      fields: 'first_name,last_name,profile_pic,locale,timezone,gender',
      access_token: FB_PAGE_TOKEN1
    },
    json: true // JSON stringifies the body automatically
   }

   console.log('^^^ CALL RQ');
   rp(options)    
   .then((response) => {    

       console.log('Suucess' + JSON.stringify(response.gender));
       var profile_pic = JSON.stringify(response.profile_pic).replace(/\"/g, "");

       console.log('1. profile_pic:' + profile_pic);

        // Now find the position of the 6th '/'
       var startPos = nth_occurrence(profile_pic, '/', 6) + 1;
       console.log('1. Start Pos: ' + startPos);  

        // Find the position of the next '.'  
       var stopPos = profile_pic.indexOf(".",startPos) ;
       console.log('2. Stop Pos: ' + stopPos);

       FB_ID   = profile_pic.substring(startPos,stopPos);


       console.log('profile_pic :' + profile_pic);
       console.log('FB_ID :' + FB_ID); 

       var gender = JSON.stringify(response.gender).replace(/\"/g, "");


       var name = JSON.stringify(response.first_name).replace(/\"/g, "");
       console.log('name: ' + name);


        console.log('** Set session variable');



        client.exists("key",FB_ID, function (err, replies) {

        if(!err && replies===1){

          console.log("THE SESSION IS ALREADY PRESENT ");
        }else{
          console.log("THE SESSION DOES NOT EXIST");
          // Now create a session from this
          client.hmset(FB_ID, {
            'gender': gender,
            'name': name
          });

          resolve();
        }});

      })
      .catch((err) => {
       console.log(err)
       reject();
      });


    })
} // fbUserInfo

What i get is :

1. profile_pic:https://scontent.xx.fbcdn.net/v/t1.0-1/p200x200/xxxxxxxxxx.jpg?oh=f43f7946f07e2bfb16fd0428da6a20e3&oe=5824B5F0
1. Start Pos: 48
2. Stop Pos: 96
profile_pic :https://scontent.xx.fbcdn.net/v/t1.0-1/p200x200/xxxxxxxxx.jpg?oh=f43f7946f07e2bfb16fd0428da6a20e3&oe=5824B5F0
FB_ID :13882352_10154200039865923_27612879517xxxxxxxx
name: Ethan
** Set session variable
^^^ gender :male
^^^ user_name :Ethan
THE SESSION DOES NOT EXIST
START to get client data
%%%%%%%%{}
Ethan Richardson
  • 461
  • 2
  • 10
  • 28

1 Answers1

3

You are not using callbacks inside promise the right way and your promise resolves before your client.hmget functions are finished. You will need promise chain to get what you need, or you can quickly fix it like this:

return new Promise((resolve,reject) => {

    client.hmget(FB_ID,'gender',function(err,reply){

        if (err) {
           return reject(err);
        }

        rowsJson.gender = reply;
        console.log('^^^ gender :' + rowsJson.gender);

      client.hmget(FB_ID,'name',function(err,reply){

        if (err) {
           return reject(err);
        }

        rowsJson.user_name = reply;
        console.log('^^^ user_name :' + rowsJson.user_name);

        resolve(rowsJson);

      });

    });

  })
Vedran Jukic
  • 841
  • 8
  • 14
  • Thank you very much, I was nearly there – Ethan Richardson Aug 07 '16 at 10:05
  • Am I using the right method , i.e. JSON to pass back multiple piece of data? – Ethan Richardson Aug 07 '16 at 10:06
  • what you are using is javascript object, not a json (json is just a file format). since you've declared your object outside of promise score, you can use it this way, but I would recommend that you read more on using promises as it will greatly simplify working with async code. – Vedran Jukic Aug 07 '16 at 12:59
  • I don't know what `hmget` does, but it is likely that you need to explicitly wait for both asynchronous callbacks and not only the last one. – Bergi Aug 07 '16 at 13:30