Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Couldn't setState from the then function of the Promise

Tags:

I'm trying to update the state from the promise which I received using the fetch function.

componentDidMount(){  fetch(url).then((responseText) => {       var response = responseText.json();       response.then(function(response){          this.setState(response);      });    }); } 

I was getting the error that the setState is not an function

Then, I tried to bind(this) to pass the this value like below.

componentDidMount(){  fetch(url).then((responseText) => {       var response = responseText.json();       response.then(function(response){          this.setState(response);      });    }).bind(this); } 

It is not working now also. Same error again.

like image 533
Sriraman Avatar asked Apr 18 '16 12:04

Sriraman


2 Answers

This is because of the scoping of this, so you're on to something when you're trying to use Function.prototype.bind. Your mistake is that you don't bind all the way down to the last anonymous function. What you probably want to do is use arrow functions all the way, like this:

componentDidMount(){     fetch(url)         .then((responseText) => responseText.json())         .then((response) => this.setState(response)); } 

Arrow functions always keep the context of this.

like image 147
Nicklas Nygren Avatar answered Oct 03 '22 08:10

Nicklas Nygren


Sorry, Just now found that I didn't bind the this variable properly.

Now, It is fixed.

componentDidMount(){    fetch(url).then((responseText) => {      const response = responseText.json();      response.then(function(response){         this.setState(response);     });    }.bind(this));  } 
like image 34
Sriraman Avatar answered Oct 03 '22 07:10

Sriraman