2017-08-15 65 views
0

所以我一直在做一些閱讀,我想我對這個問題有一個總體把握,但可以使用一些更有經驗的人的洞察力。我一直在嘗試在Meteor中編寫一個簡單的RSS閱讀器,並且一直在面臨一些異步調用Meteor方法的問題。我目前在服務器上定義方法(同步)並在客戶端上調用它(異步)。我不明白的是,當我嘗試在服務器上創建HTTP.call時,如果將回調傳遞到請求中,則會返回傳遞給我的客戶端的未定義值。但是,當我同步API請求時,一切似乎都正常。這是我應該期待的正常行爲/我應該如何進行API調用?需要澄清異步調用流星方法

Meteor.methods({ 
 
\t \t getSubReddit(subreddit) { 
 
\t \t \t this.unblock(); 
 
\t \t \t const url = 'http://www.reddit.com/r/' + subreddit + '/.rss'; 
 
\t \t \t const response = HTTP.get(url, {}, (err, res) => { 
 
\t \t \t \t if(!err) { 
 
\t \t \t \t \t //console.log(res.content); 
 
\t \t \t \t \t return res; 
 
\t \t \t \t } else { 
 
\t \t \t \t \t return err; 
 
\t \t \t \t } 
 
\t \t \t }); 
 
\t \t } 
 
\t });

這裏的服務器側所限定的方法。請注意,記錄res.content顯示我實際上從呼叫中獲得了正確的內容。我試着閱讀關於這個主題的其他一些答案,並且看到了有關使用Future/wrapAsync的一些事情,但我不確定我能得到它。任何幫助將不勝感激!

+0

請看看我的答案爲[這個問題](https://stackoverflow.com/questions/33644547)。 –

+0

謝謝@DavidWeldon。因此,如果我理解正確,如果我希望在服務器上異步運行我的調用,則必須將調用的返回值存儲在服務器上的某個位置,然後將其傳遞給客戶端? –

+0

通常情況下,模式是:(1)客戶端對服務器方法進行異步調用,(2)該方法對某個服務進行同步調用(使用try/catch就像我的示例),然後將值返回給客戶端3)客戶端收到數據並執行相關操作。那有意義嗎? –

回答

0

HTTP.get正在做異步工作,所以傳遞給它的回調將從這個流星方法調用上下文中調用。

,從而獲得所需的結果,你應該做這樣的:

Meteor.methods({ 
    getSubReddit(subreddit) { 
    // IMPORTANT: unblock methods call queue 
    this.unblock(); 
    const url = 'http://www.reddit.com/r/' + subreddit + '/.rss'; 
    const httpGetSync = Meteor.wrapAsync(HTTP.get); 
    try { 
     const response = httpGetSync(url, {}); 
     //console.log(response.content); 
     return response.content; 
    } catch (err) { 
     // pass error to client 
     throw new Meteor.Error(...); 
    } 
    } 
});