ReactJS SetState在递归$ .getJson中

时间:2017-12-21 17:32:06

标签: jquery reactjs recursion

实际上,

我正在尝试从调用中获取结果并将其设置为状态,但它不起作用,我不明白为什么:

onButtonClick() {
 this.setState({Data: call(id, token)});
}


function call(Id, Token){
  var brand = Id;
  ReportTitle = brand;
  url = base_url + brand + "/posts?access_token=" + Token + request;
  var hasnext = true;
  return getNextAndConcatJSonOrNot(url, 0, finalJson);
}

在这个函数中,我在$ .getJSON中进行递归调用。

function getNextAndConcatJSonOrNot(urlToCall, cnt, jsonData){
  var jsonFinalObject = '';
  $.getJSON(urlToCall).done(function(data) {
      var tempJson = {};
      tempJson = jsonData.concat(data.data);
      jsonData = tempJson;
      cnt++;
      if(data.paging.next != "" && cnt < 2){
        getNextAndConcatJSonOrNot(data.paging.next, compteur, jsonData);
      } else {        
        return JSON.stringify(jsonData);
      }
  });
}

但是每次返回''时,我都试图将.bind(this)放在$ .getJson的末尾并在内部执行setState但它不起作用。 我首先尝试使用我的函数(除了onbuttonclick)在另一个file.js中,然后我尝试在组件中使用这些函数。

我能做些什么让这项工作好吗?感谢。

2 个答案:

答案 0 :(得分:1)

您无法从Created /tmp/tmp.Toet7Wn7bz file, with data= 4221696069 Created /tmp/tmp.kc9OLaX84U directory Created /tmp/tmp.S2OQ8Wh6Iz file, with data= 172066121 Created /tmp/tmp.d1oFQ4DINx directory Created /tmp/tmp.wGl42vpRLc file, with data= 3188097801 Created /tmp/tmp.xbAhMUFAZi directory Created /tmp/tmp.4dI5M7amYL file, with data= 1085037810 Created /tmp/tmp.vAMAg39pjK directory Created /tmp/tmp.AXP6yztDMj file, with data= 2348013838 Created /tmp/tmp.Qc5kyZtmnn directory 返回数据,因为.done会返回Promise。您应该传递一个回调函数,将状态设置为.done并在getNextAndConcatJSonOrNot中调用它。

.done

这样的事情应该有效。

答案 1 :(得分:0)

好的,在Max的答案的帮助下我找到了解决方案:

handleResponse(data, context) {
  // bind this in your constructor.
  context.setState({ Data: data });
}

onClick() {
  var brand = Id;
  ReportTitle = brand;
  url = base_url + brand + "/posts?access_token=" + Token + request;
  var hasnext = true;
  getNextAndConcatJSonOrNot(url, 0, finalJson, this);
}

getNextAndConcatJSonOrNot(urlToCall, cnt, jsonData, context){
  var jsonFinalObject = '';
  $.getJSON(urlToCall).done(function(data) {
    var tempJson = {};
    tempJson = jsonData.concat(data.data);
    jsonData = tempJson;
    cnt++;
    if(data.paging.next != "" && cnt < 2){
      getNextAndConcatJSonOrNot(data.paging.next, compteur, jsonData);
    } else {        
      context.handleResponse(jsonData, context);
    }
 }.bind(this));
}

解决方法是添加.bind(this)并在getNextAnd ...函数中传递“this”以获取handleResponse和setState的上下文。