Saturday, 5 October 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));
php - file_get_contents shows unexpected output while reading a file
I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print ...
-
I would like to split a String by comma ',' and remove whitespace from the beginning and end of each split. For example, if I have ...
-
I have an app which needs a login and a registration with SQLite. I have the database and a user can login and register. But i would like th...
-
I have a method in repository with this implementation which returns a Task Task > GetAllAppsRequestAsync(); I write the getter which cal...
No comments:
Post a Comment