2016-07-20 4 views
1

Я установил функцию обратного вызова внутри моего атеистического метода Meteor для вызова «читаемого» события. Но обратный вызов не вызывается, когда загорается «читаемый» (я знаю, что его увольняют из console.log, который я установил).Meteor js callback не работает

Я что-то упустил? Я уже несколько часов пробовал несколько разных вещей!

Meteor.startup(() => { 

    Meteor.call("getfeed", function(feedloader) { 
    //I get: TypeError: undefined is not a function] 
    console.log(feedloader); 
    }); 

}); 

Meteor.methods({ 

    getfeed: function(callb) { 

    var req = request('http://feeds.feedburner.com/Techcrunch'); 
    var feedparser = new FeedParser(); 
    testing = []; 

    //........a bunch of functions........ 

    feedparser.on('readable', function() { 

     var stream = this 
     , meta = this.meta 
     , item; 

     while (item = stream.read()) 
     { 
     //I'm pushing the results into testing var 
     testing.push(item); 
     } 

     //From the logs I can see that this is called 12 times 
     //but the callback's not firing!!! 

     console.log(testing.length); 
     callb(testing); 

    }); 
    } 
}); 

ответ

1

методы Метеор не являются асинхронные функции в том смысле, что они не получают аргумент обратного вызова, даже если вы передаете его, когда вы «называют» метод. Вместо этого каждый метод выполняется в пределах Fiber, что является еще одним аспектом работы с асинхронным кодом.

К счастью, у Метеор хороший помощник, который позволяет смешивать оба стиля. Что вам нужно сделать, это обернуть «чистую» асинхронную часть вашего кода метода с помощью Meteor.wrapAsync. Эта структура должна выглядеть примерно так:

Meteor.methods({ 

    getfeed: function() { 
    var wrapped = Meteor.wrapAsync(function (callb) { 

     var feedparser = new FeedParser(); 
     testing = []; 

     // ... 

     feedparser.on('readable', function() { 
     // probably the same code you have, but without "callb()" 
     }); 

     feedparser.on('end', function() { 
     // NOTE: No error here, so the first argument must be null. 
     callb(null, testing); 
     }) 
    }); 

    // NOTE: Finally, call the wrapped function 
    return wrapped(); 
    } 
}); 
+0

Привет, проблема в том, что у меня нет события «end». «Читаемое» событие здесь неоднократно вызывается до тех пор, пока оно не остановится, и я не знаю, когда оно прекратится! так есть ли способ сохранить переменную 'testing' в синхронизации с переменной? – jaisonDavis

+0

Извини, мой плохой. Существует конечное событие. Пропустил это! – jaisonDavis

+0

И да, это должно быть возвращено завернутым(); вместо просто wrapped(); – jaisonDavis

Смежные вопросы