2016-07-20 14 views
1

Ich habe eine Callback-Funktion in meiner Meteor async-Methode eingerichtet, die bei einem "lesbaren" Ereignis aufgerufen wird. Aber der Callback wird nicht aufgerufen, wenn der on. "Lesbar" ausgelöst wird (ich weiß, dass er von der console.log, die ich eingerichtet habe, ausgelöst wird).Meteor js callback funktioniert nicht

Fehle ich hier etwas? Ich bin seit ein paar Stunden dabei und probiere ein paar verschiedene Dinge aus!

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); 

    }); 
    } 
}); 

Antwort

1

Meteor Methoden sind nicht asynchrone Funktionen in dem Sinne, dass sie das Callback-Argument nicht bekommen, auch wenn Sie es passieren, wenn Sie eine Methode „Anruf“. Stattdessen wird jede Methode innerhalb einer Fiber ausgeführt, die eine andere Variante des Umgangs mit asynchronem Code ist.

Glücklicherweise hat Meteor einen netten Helfer, mit dem Sie beide Stile mischen können. Was Sie tun müssen, ist den "reinen" asynchronen Teil Ihres Methodencodes mit Meteor.wrapAsync zu umbrechen. Diese Struktur sollte mehr oder weniger so aussehen:

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

Hallo, das Problem hier ist, dass ich kein 'Ende' Ereignis habe. Das "lesbare" Ereignis wird hier wiederholt aufgerufen, bis es aufhört und ich weiß nicht, wann es aufhört! Gibt es eine Möglichkeit, die Variable 'Testen' mit einer Variablen synchron zu halten? – jaisonDavis

+0

Sorry mein Schlechter. Es gibt ein Endereignis. Verpasst das! – jaisonDavis

+0

Und ja, es muss zurück verpackt werden(); anstatt nur eingewickelt(); – jaisonDavis