Vraag Meteor abonneren terugbellen


Volgens dit artikel hier:

https://dweldon.silvrback.com/common-mistakes

Abonnementen blokkeren niet

Veel aspecten van het raamwerk lijken magisch. Zo veel zelfs dat het kan   ervoor zorgen dat u vergeet hoe webbrowsers werken. Neem dit eenvoudige voorbeeld:

Meteor.subscribe ( 'posts');

var post = Posts.findOne ();

Het idee dat post ongedefinieerd is, is de oorzaak van ongeveer één   in twintig meteor vragen over stackoverloop.

Waarom abonneert u zich dan niet op een callback, en zo ja, waarom wordt er dan niet vaker naar verwezen door de Meteor-literatoren?

Waarom hebben we niet:

Meteor.subscribe('posts', function(err, posts){

//when the items/posts actually arrive

}); 

Ik hoop dat mijn vraag klopt.


24
2018-02-20 03:22


oorsprong


antwoorden:


Misschien krijg ik de vraag niet, maar de functie Meteor.Subscribe heeft callbacks met de namen onError en onReady.

Optioneel. Kan onError en onReady callbacks bevatten. Als een functie is   doorgegeven in plaats van een object, wordt dit geïnterpreteerd als een onReady callback.

Van docs.

Bijvoorbeeld.

Meteor.subscribe("posts", {
  onReady: function () { console.log("onReady And the Items actually Arrive", arguments); },
  onError: function () { console.log("onError", arguments); }
});

Controleer ook dit GitHub-probleem


48
2018-02-20 03:27



Opmerking: ik heb het artikel bijgewerkt na het lezen van deze vraag.

Terwijl abonneren heeft een optionele callback, ik heb dit bewust vermeden in het originele artikel omdat er momenteel geen algemene patronen zijn die dit gebruiken. Met andere woorden, ik wilde niet dat lezers weggingen van het artikel omdat ze dachten dat callbacks eigenlijk de juiste oplossing voor dit probleem waren.

In productietoepassingen zijn abonnementen meestal in twee smaken:

  • Globaal: geïnitieerd zodra de client start, of misschien in een autorun.

  • Route: geïnitieerd als via een subscriptions of waitOn  keuze.

Het is ook vermeldenswaard dat in de afgelopen weken de sjabloon abonnement patroon is naar voren gekomen, hoewel er nog geen brede adoptie is geweest.

In al deze gevallen wordt het abonnement gestart en kan het vervolgens asynchroon worden gecontroleerd op reactief ready staat, of genegeerd met het gebruik van bewakers om referentiefouten te voorkomen.

Omdat ready is reactief, dit geeft ons effectief dezelfde voordelen als een callback, maar met minder regels code. Laten we twee voorbeelden bekijken:

voorbeeld 1

Meteor.subscribe('posts', function() {
  Session.set('postsReady', true);
});

Tracker.autorun(function() {
  if (Session.get('postsReady'))
    showFancyAnimation();
});

voorbeeld 2

var handle = Meteor.subscribe('posts');

Tracker.autorun(function() {
  if (handle.ready())
    showFancyAnimation();
});

Beide voorbeelden demonstreren hetzelfde concept - inschrijven en vervolgens reactief testen van de staat van het abonnement. Zoals je kunt zien is er echt geen voordeel voor de callback.

Ten slotte (zoals ik nu in het artikel uitleg), zijn abonnementen vaak ruimtelijk gescheiden van de code die ze gebruikt. Je abonneert je meestal in je routecode en consumeert de resultaten in je sjablonen. Om deze reden zie je bijna nooit code die er als volgt uitziet:

Meteor.subscribe('posts', function() {
  showFancyAnimation();
});

In feite is de enige plaats waar ik ooit code tegenkom zoals de bovenstaande in SO antwoorden, omdat de auteur een snelle demonstratie probeert te maken in plaats van te proberen een gebruikspatroon te tonen.


19
2018-02-20 04:40



Meteor.subscribe is verbeterd sinds v1.2. Een van zijn callbacks onErroris nu vervangen door onStop in Meteor v1.2.0.2 documentatie

callbacks Functie of Object

Optioneel. Kan onStop en onReady callbacks bevatten. Als er een is   fout, het wordt doorgegeven aan een argument aan onStop. Als een functie wordt doorgegeven   in plaats van een object, wordt dit geïnterpreteerd als een onReady callback.

Met die verbetering, Meteor.subscribe wordt gebruikt met callbacks als een object

Meteor.subscribe( 'collection', {
    onStop:  function( error /* optional */ ) {
        // when the sub terminates for any reason,
        // with an error argument if an error triggered the stop
    },
    onReady: function() {
        // when ready
    }
});

Echter, onError werkt nog steeds voor achterwaartse compatibiliteit. Houd er rekening mee dat sommige populaire pakketten, zoals SubsManager nog steeds gebruikt onError. Dat gezegd hebbende dergelijk fragment hieronder is nu verouderd, maar breekt niet.

Meteor.subscribe( 'collection', {
    onError: function( error ) {
        // if the subscribe terminates with an error
    },
    onReady: function() {
        // when ready
    }
});

Aan de andere kant, Meteor.subscribe kan worden gebruikt met een terugroepfunctie als een functie als voorheen

Meteor.subscribe( 'collection', function() {
    // when ready
});

Als mijn persoonlijke kennisgeving, als Meteor.subscribe gebeurt er met onzorgvuldig meerdere callback-functies, alleen de laatste heeft effect als de onReady Bel terug.

Meteor.subscribe( 'collection', function() {
    // this doesn't execute.
}, function() {
    // when ready.
});

De bijbehorende Git-verplichting wordt vermeld hier voor een referentie.


11
2017-10-19 04:52