2013-01-12 228 views
4

我使用Node.js的ntwitter模塊訪問Twitter的流API從流星內部應用程序,而是試圖插入回調函數內收集應用程序崩潰時:異步回調

twitter.stream('statuses/filter', {'track':'whatever'}, function(stream) { 
    stream.on('data', function (data) { 
     //logging the data coming back works fine 
     console.log(data); 
     //the next line throws "Error: Meteor code must always run within a Fiber" 
     Tweets.insert(data); 
    }); 
}); 

在Meteors線性執行模型的上下文中是否有推薦的方法來使用異步回調?我嘗試在一個新的光纖內包裹插入,這似乎工作,但我不確定它可能有任何影響。

我發現這個http://gist.io/3443021這是有益的,但我仍然不確定哪種方法適合我的特殊情況,所以任何幫助將不勝感激。

乾杯

回答

0

我們使用了不同的設計模式。在異步回調,我們更像一個設備驅動程序並簡單地緩衝該結果在存儲器中:

var tweets = []; 

twitter.stream('statuses/filter', {'track':'whatever'}, function(stream) { 
    stream.on('data', function (data) { 
     //logging the data coming back works fine 
     console.log(data); 
     //the next line throws "Error: Meteor code must always run within a Fiber" 
     tweets.push(data); 
    }); 
}); 

再後來上,內的光纖內的正常流星執行環境背面,無論是在一個計時器或一個結果的函數,我們將tweets數組排除,然後執行插入操作。 Javascript數組並不關心它是否在光纖內運行。

在我們的案例中,我們使用異步IMAP電子郵件而不是推文進行此操作,但類比依然成立。

+0

雖然這將工作,在我的情況下,它會有點否定具有實時流數據的點,因爲我使用流api而不必輪詢第一個地方 – jul

+1

輪詢在哪裏?這與之前的回調相同。輪詢不在Twitter流上,它位於內存緩衝區中,這不過是快速查詢,而不是Twitter的投票。 –

+0

好吧,我不需要以某種間隔輪詢數組嗎?如果可能,我寧願實時更新集合。 – jul

0

環繞你的回調在Meteor.bindEnvironment像這樣:

twitter.stream('statuses/filter', {'track':'whatever'}, function(stream) { 
    stream.on('data', Meteor.bindEnvironment(function (data) { 
     //logging the data coming back works fine 
     console.log(data); 
     //the next line throws "Error: Meteor code must always run within a Fiber" 
     Tweets.insert(data); 
    })); 
}); 

this SO post about Async wrappers on the Meteor Server,要使用Meteor.bindEnvironment當您使用第三方API/NPM模塊(這看起來是如此)管理回調

Meteor.bindEnvironment創建一個新光纖並將當前光纖的變量和環境複製到新光纖。