2016-04-04 18 views
1

YouTube IDを入力する簡単なフィールドがあります。私はあなたのYouTubeのクリップのタイトルを取得するには、renaldoのYouTubeのAPI(https://atmospherejs.com/renaldo/youtube-api)を使用しています。なぜ私のMeteor.methodは未定義に戻りますか?

クライアントサイドイベントは、トラックID(var tid)値をメソッド 'addTrack'に正常に渡します。トラックのタイトルがサーバーのコンソールに出力されます。私は本当に悪い時を何かをすべてクライアントに戻しています。

私は 'addTrack'メソッドから 'getVideoData'メソッドを呼び出すと、毎回 'undefined'が返されます。私は流星やジャバスクリプトの専門家ではない、これは私がそれの地獄のために学んでいるものです。

私はコールバックの概念とjavascriptの同期性を理解しています(私は思っています!)。

ありがとうございました。

[EDIT以下のコードは、将来の使用、私の問題を解決する]

if (Meteor.isServer) { 

    YoutubeApi.authenticate({ 
    type: 'key', 
    key: API_KEY 
    }); 

Meteor.methods({ 
    addTrack: function(tid) { 

    Meteor.call("getVideoData", tid, function(err,res) { 

    console.log(res); 

    }); 
    }, 
    getVideoData: function(tid) { 
    var future = new Future(); 

    YoutubeApi.videos.list({ 
    part: "snippet", 
    id: tid, 
    }, function (err,data) { 
     var _data = {"title":data.items[0].snippet.title,"desc":data.items[0].snippet.description}; 
     future["return"](_data) 

    }); 
    return future.wait(); 

} 

Meteor.startup(関数(){ 未来= Npm.require( '繊維/未来');

} ); }

+0

これはいくつかの可能な解決策を持つ非常に一般的な流星の質問です。基本的な問題は、メソッドが非同期関数を呼び出すことです。 –

+0

他のメソッドからメソッドgetVideoDataを呼び出す方法、Meteor.call( "getVideoData")を使用していますか? – Zafta

+0

はい、私はMeteor.call( "getVideoData")経由で別のメソッドからメソッドを呼び出していますが、まだ定義されていません。 – rick

答えて

2

メテオールメソッドは、同期するようにFibersを使用するので、トリッキーです(よく、それらは同期として開発者に表示されます)。したがって、YoutubeApiにすべてをラップするにはMeteor.wrapAsync()を使用する必要があります。私は、次のコードをテストしていませんが、それは次のようになります。

Meteor.methods({ 
    getVideoData: function(tid) { 
    var syncYT = Meteor.wrapAsync(YoutubeApi.videos.list); 
    var data = syncYT({part: "snippet",id: tid,}); 
    var transformed = {"title":data.items[0].snippet.title,"desc":data.items[0].snippet.description}; 

    console.log(transformed.title); 
    return transformed.title; 
    } 
}); 

あなたは、この場合のエラー処理についての詳細を読みたいと思うでしょうが、これはあなたが軌道に乗る必要があります。クライアント側のMeteorは常に非同期であり、サーバー側はオプションで非同期であることを覚えておいてください。メソッドの非同期ニーズを処理するには、wrapAsyncまたはFuturesを使用します。

最後に、Meteor guideは素晴らしいです、それを使用してください!

関連する問題