1

Woohoo、私からのMeteorの質問が増えました!私がやろうとしているのは、YouTube DataAPIv3からユーザーのチャンネル「スニペット」を取得することです。itemsこれには、アプリケーションに必要なすべてのデータを含むと呼ばれる配列を持つオブジェクトが含まれています。私の現在のクライアントコードは次のとおりです。

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何らかの理由で戻ります。つまり、戻り値を使用できません。

なぜこうなった?

4

2 に答える 2

3

これは、2番目の引数としてデータを返すメソッドを、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はコードが利用可能になると再実行します。

于 2013-01-02T12:34:48.920 に答える
0

MeteorのIRCChannelで多くの作業と議論を重ねた結果、ようやくこの要点で実用的な結論に達しました。

于 2013-01-05T02:39:35.393 に答える