2014-01-16 78 views
0

我一直在流星中使用RSS解析器有一個問題,它是一個異步調用,所以它不需要包裝,但它似乎仍然沒有工作。我想這是因爲(「讀」功能匿名在光纖外部,但我看不出如何解決它。異步調用生成「錯誤:無法等待沒有」光纖「,即使_wrapAsync

var FeedParser = Meteor.require('feedparser'); 
var request = Meteor.require('request'); 

function getBlog(url, parameter, id){ 

    request(parameter) 
     .on('error', function (error) { 
      console.error(error); 
     }) 
     .pipe(new FeedParser()) 
     .on('error', function (error) { 
      console.error(error); 
     }) 

     .on('readable', function() { 
      var stream = this, 
       item; 
      while (item = stream.read()) { 
       Items.insert(new_item);     
      } 
     }); 
    } 

var wrappedGetBlog = Meteor._wrapAsync(getBlog); 


Meteor.methods({ 
    blog: function (url, parameter, id) { 
     console.log('parsing blog'); 
     var items = wrappedGetBlog(url, parameter, id); 
    } 
}); 

回答

2

Meteor._wrapAsync()預計包裹功能你的函數getBlog()不會這麼做_wrapAsync不是正確的方法。

我已包裝that function be但是使用了未來。

該方法允許我從Meteor.method()調用feedparser,該函數不允許異步函數,但您也嘗試在可讀事件中執行insert。我認爲insert會抱怨,如果它不在光纖中。也許就像這也將是必要的:

var r = request(parameter); 
r.on('response' , function(){ 

    var fp = r.pipe(new FeedParser()); //need feedparser object as variable to pass to bindEnvironment 

    fp.on('readable', Meteor.bindEnvironment( 
    function() { 
     var stream = this, 
     item; 
     while (item = stream.read()) {   
     Items.insert(new_item);     
     } 
    } 
    , function(error){ console.log(error);} 
    , fp // variable applied as `this` inside call of first function 
)); 
}); 

纖維是另一種選擇......

var Fiber = Npm.require("fibers"); 

.on('readable', function() { 
    var stream = this, 
     item; 
    while (item = stream.read()) {   
     Fiber(function(){ 
      Items.insert(new_item); 
      Fiber.yield(); 
     }).run();     
    } 
}); 
+0

感謝您看這個。麻煩的是,這樣做會導致流變量釋放它的上下文,以致它不再擁有stream.read()方法。我發現Feed Parser的語法非常混亂... – Jim

+0

也可以使用光纖。將輸出傳遞迴該方法,並讓它執行插入操作。 – user728291

+0

驚人的,完美的作品。看起來我可能不得不開始理解光纖。 – Jim