2016-08-07 25 views
0

我想调用一个函数,然后返回一些数据返回到返回的参数中,我使用承诺但我无法获取返回的数据。从承诺解析调用传回数据

我的电话在这里:

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

我的功能在这里被定义

/* 
* 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 

什么,我得到的是:

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

如果'client.hmget'是异步的,你需要重写代码 - 因为你当前在client.hmget甚至会调用回调之前解析 –

+0

避免'fbUserInfo'中的['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

@Bergi,为什么我应该避免这个,有什么替代? – user1907509

回答

1

您没有使用回调里面答应的权利方式和你的承诺在你的client.hmget函数完成之前解决。 您将需要许链得到你所需要的东西,或者你可以快速解决问题是这样的:

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

     }); 

    }); 

    }) 
+0

非常感谢,我快到了 – user1907509

+0

我是否使用正确的方法,即JSON传回多个数据? – user1907509

+0

你使用的是javascript对象,而不是json(json只是一种文件格式)。因为你声明你的对象超出promise分数,所以你可以这样使用它,但是我建议你阅读更多关于使用promise的内容,因为它将大大简化异步代码的工作。 –