Saturday, October 5, 2019
Javascript: Promises + this
Answer
Answer
Consider the following code:
foo: function() {
var self = this;
var p1 = p2 = someFunctionThatReturnsAPromise();
Promise.all([p1, p2])
.then(self.bar);
}
bar: function(promises) {
var self = this;
console.log(self);
}
Output:
undefined
But if I do the following instead:
foo: function() {
var self = this;
var p1 = p2 = someFunctionThatReturnsAPromise();
Promise.all([p1, p2])
.then(function(result) {
self.bar(result);
});
}
bar: function(promises) {
var self = this;
console.log(self);
}
Output:
{ foo: [Function],
bar: [Function] }
I don't understand why the first call changes where this points in the bar function. Can someone enlighten me?
Answer
When you pass self.bar
to the then
method, you pass a function reference. Although it looks like you also specify it should be called on the self
object, that is actually not what is happening. The self
object is not included in that function reference. The this
object's value is determined when a function is called, not when it is defined or passed as argument.
In your second example, self
is the this
object within the function context, because that is where you call the function from.
Another way to get it working is to force the function's this
object to always be self
, overriding the above described behaviour. You can achieve that with .bind()
:
Promise.all([p1, p2])
.then(self.bar.bind(self));
hard drive - Leaving bad sectors in unformatted partition?
Laptop was acting really weird, and copy and seek times were really slow, so I decided to scan the hard drive surface. I have a couple hundr...
-
I tried adding grubx64.efi in the Windows Boot Manager using BCDEdit. However when I boot up my computer and try to start GRUB from Windows ...
-
Using Windows 7. When I RDP to a PC I'd like to be able to logout of the session without the screen reverting to a Ctrl+Alt+Del Login sc...
-
So I installed Ubuntu Netbook Remix 9.10 onto my Asus EeePC 1008HA netbook. It worked perfectly and was pretty quick. Restarting, suspending...
No comments:
Post a Comment