【问题标题】:Usage of callback functions and asynchronous requests回调函数和异步请求的使用
【发布时间】:2012-09-16 20:01:54
【问题描述】:

我正在使用一个使用 Facebook API 的 node.js 应用程序。在我的代码的一部分中,我需要从一个常用函数中返回 access_token。也就是说,很多其他函数都需要调用这个函数来检索 Facebook 访问令牌。

下面是我的代码:

function getAccesstoken(code) {
    var options = {
        host: 'graph.facebook.com',        
        path: '/oauth/access_token?client_id=xxxx&redirect_uri=xxxxxx&client_secret=xxxxx&code='+code.toString()
    };

    var acc_token = ''

    https.get(options, function(resp) {
        resp.on('data', function(d) {                                    
            acc_token = acc_token+d.toString()
        });    

        resp.on('end', function() {
            var expiry_index = acc_token.indexOf('&expires=')

            acc_token = acc_token.substring(0, expiry_index)            
        });
    });        

    return acc_token.toString()
}

由于https.get 调用是异步的,函数总是返回一个空字符串。最好的方法应该是什么?

【问题讨论】:

  • 您是否担心系统的另一部分会请求access_token 而您却没有,或者您不知道如何继续,意识到您需要对您正在建模的东西进行建模不熟悉(事件驱动编程)?

标签: javascript facebook node.js


【解决方案1】:

为您的 getAccesToken 函数提供一个回调函数,并在响应结束后调用该函数并将 acc_token 传递给该函数..

 function getAccessToken(code,cb){
    .....
    resp.on('end',function(){
       .....
       cb(null,acc_token)
    })
 }

然后像这样调用你的函数

getAccesToken("whatever",function(err,token){
  console.log("got token", token)
})

【讨论】:

  • 感谢 supernova,是时候学习回调的威力了 :)
【解决方案2】:

您已经回答了标题中的问题 - 请使用回调。

getAccesstoken 定义另一个变量,该变量应该是在acc_token 被填充时调用的函数,并将acc_token 作为参数传递给该函数以供使用。

这与https.get 的工作方式相同——第二个参数是在请求完成时调用的函数,并传递请求的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2019-12-10
    相关资源
    最近更新 更多