Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ES6 Arrow function is changing the scope of this in Meteor.publish [duplicate]

So I been started using ES6 in Meteor, but apparently if you try to use Meteor.publish syntax with an arrow function, this.userId is undefined, while if you use it with a regular function(){} this.userId works perfectly, Im assuming is a kind of transpiler process that assign a different this, to userId but is just a guess, does anyone knows what really is happening?

Meteor.startup(function() {
    Meteor.publish("Activities", function() { //with function
        console.log(this.userId); //TS8vTE3z56LLcaCb5
    });
});

Meteor.startup(function() {
    Meteor.publish("Activities", ()=> { //with arrow function
        console.log(this.userId); //undefined
    });
});
like image 753
ncubica Avatar asked Oct 10 '15 17:10

ncubica


1 Answers

This isn't a transpilation error, it's a feature of arrow functions. The arrow function automatically sets the context of the function body to the contexts here it was created, in this case the callback to Meteor.publish. This prevents Meteor from rebinding the context of your listener function.

From the Meteor publish docs:

Inside the function, this is the publish handler object

If you want things to work properly you will need to use the "old-school" function syntax to allow Meteor to set the context properly.

like image 74
Nick Tomlin Avatar answered Sep 28 '22 07:09

Nick Tomlin