2016-04-04 16 views
1

Youtube kimliğini girmek için basit bir alan var. Youtube klibin başlığını almak için renaldo youtube api (https://atmospherejs.com/renaldo/youtube-api) kullanıyorum.Meteor.method neden geri dönülmez?

İstemci tarafı olayı, iz ID (var tid) değerini 'addTrack' yöntemine başarılı bir şekilde geçirir - izleyicinin başlığını sunucudaki konsola gönderir. Müşteriye geri döndüğümde gerçekten kötü bir zaman geçiriyorum.

'addTrack' yönteminden 'getVideoData' yöntemini çağırırsam, her seferinde yine 'undefined' değerini döndürür. Meteor ya da javascript konusunda uzman değilim, bu sadece cehennem için öğreniyorum.

Geri arama kavramı ve javascript'in eşzamanlı doğasını anlıyorum (Sanırım!).

Teşekkürler.

[DÜZ kodu aşağıda daha kullanarak, zaman sorunu çözer]

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 (fonksiyonu() { Gelecek = Npm.require ('lifler/gelecek');

}); }

+0

Bu, çeşitli olası çözümlere sahip çok yaygın bir Meteor sorudur. Temel sorun, yönteminizin eşzamansız bir işlevi çağırmasıdır. –

+0

Diğer yöntemlerden "getVideoData" yöntemini nasıl çağırıyorsunuz, Meteor.call ("getVideoData") kullanıyor musunuz? – Zafta

+0

Evet, Meteor.call ("getVideoData") aracılığıyla başka bir yöntemden yöntemi çağırıyorum ve hala tanımlanmamış oluyor. – rick

cevap

2

Meteor yöntemleri, Fibers'u eşzamanlı olarak kullandıkları için oldukça zordur (iyi, geliştiriciye senkronize olarak görünürler). Bu nedenle, hepsini YoutubeApi'ye sarmak için Meteor.wrapAsync()'u kullanmanız gerekir. Aşağıdaki kodu test etmedim ama gibi görünmelidir:

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; 
    } 
}); 
Bu durumda işleme hata hakkında daha fazla okumak isteyeceksiniz

, ama bu gidiş iyi olur. Sadece istemci tarafı Meteor'ın daima eşzamansız olduğunu ve sunucu tarafının isteğe bağlı olarak senkronize olmadığını unutmayın. Yöntemlerde uyumsuzluk gereksinimlerini ele almak için wrapAsync veya Futures kullanın.

Son olarak, Meteor guide harika, kullan!

İlgili konular