2012-09-16 69 views
0

我正在使用使用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調用是異步的,函數總是返回一個空字符串。最好的辦法是什麼?

+0

你擔心繫統的另一部分將要求'access_token',而你不會擁有它,或者你不知道如何繼續實現,你需要建模你不熟悉的東西(事件驅動的編程)? –

回答

0

以及提供的回調函數,你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) 
}) 
+0

感謝超新星,現在是時候學習回調的力量了:) – Vivek

0

您已經在標題中回答了問題 - 請使用回調。

getAccesstoken定義另一個變量,該變量應該是在填充acc_token時調用的函數,並將acc_token作爲該函數的參數使用。

這與https.get正在工作的方式相同 - 第二個參數是在請求完成時調用的函數,並且通過請求的結果。