user1907509 user1907509 - 4 months ago 20
Javascript Question

Passing data back from a promise resolve call

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
%%%%%%%%{}

Answer

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);

      });

    });

  })