2013-01-02 30 views
1

哇噢從我檢索,更多的流星的問題!我想要做的是從YouTube Data API v3中檢索用戶的頻道「片段」。這包含一個對象,其中包含一個名爲items的數組,其中包含我的應用程序中需要的所有數據。我現在的客戶端代碼如下:Meteor.JS從谷歌API的問題

if (Meteor.user() && !Meteor.loggingIn()) { 
    Meteor.http.get("https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true&access_token=" + Meteor.user().services.google.accessToken, function (err, result) { 
     console.log(result.statusCode, result.data); 
     var retdata = result.data; 
     return retdata.items; 
    }); 
} 

其中在客戶端控制檯輸出這樣的:

200 
Object {kind: "youtube#channelListResponse", etag: ""eTr3dHIt5_K9qdGtRKL-5XdpiQI/4Lt-RSCeBy7D3VwX3c_uic6-LIM"", pageInfo: Object, items: Array[1]} 

但功能出於某種原因,這意味着我不能用它的返回值返回undefined

這是怎麼發生的?

回答

0

經過大量的工作,並與流星的IRC頻道的人討論,我們終於來到了這個gist工作結論。

3

這是因爲您將要返回數據的方法作爲第二個參數傳遞給http.get作爲異步回調,一旦從您調用的地址返回數據,就會調用該異步回調。所以:

Meteor.http.get(url, callback); 

不返回任何東西。取而代之的,而不是在回調返回一個對象,在範圍設置的東西的get外面來代替:

if (Meteor.user() && !Meteor.loggingIn()) { 
    var url = "https://www.googleapis.com/youtube/v3/channels"; 
    var params = { 
     access_token: Meteor.user().services.google.accessToken, 
     part: "snippet", 
     mine: "true" 
    }; 
    Meteor.http.get(url, {params: params}, function (err, result) { 
     console.log(result.statusCode, result.data); 
     var retdata = result.data; 
     Session.set("myItems", retdata.items); 
    }); 
} 

確保您還可以手動發佈services.google.accessToken場,否則將不提供Meteor.user()。並且確保你在模板或某個地方做了所有這些工作,如果Meteor.user()尚不可用,Meteor將會在代碼重新運行之後重新運行代碼。

+0

我試過了,但仍在登錄到控制檯,但仍出於某種原因返回undefined。我應該把它放在一些特定的方法或東西,還是我可以直接放到client.js? – troytc

+0

更正 - 它根本沒有做任何事情。我在client.js中的Meteor.startup中運行它。 – troytc

+0

啊 - 根據[該文檔(http://docs.meteor.com/#meteor_http),第二個參數是'[選項]',不回調,因此應該通過PARAMS作爲第二個參數,然後作爲第三個參數傳遞函數。我更新了這個例子。 – Rahul