2017-12-21 8 views
0

,

내가 호출에서 결과를 얻을 상태로 설정하기 위해 노력하고있어하지만이 일을하지 않고, 내가 볼 수 없습니다 재귀의 이유 :

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); 
     } 
    }); 
} 

는하지만 '반환 할 때마다, 나는 $ .getJson의 끝에서 (이) .bind 넣어 내부와 setState를하려고 노력하지만 일을하지 않습니다. 다른 file.js에서 내 함수 (onbuttonclick 제외)를 먼저 시도한 다음 구성 요소에서 이러한 함수를 사용해 보았습니다.

이 작업을 수행하려면 어떻게해야합니까? 감사.

+0

구성 요소의 전체 코드를 추가 할 수 있습니까? –

답변

0

좋아, 최대의 대답의 도움으로 나는 해결책을 발견 handleResponse 및 setState의 컨텍스트

1

.done이 약속을 반환하기 때문에 .done에서 데이터를 반환 할 수 없습니다. 상태를 getNextAndConcatJSonOrNot으로 설정하고 .done에서 호출하는 콜백을 전달해야합니다.

handleResponse(data) { 
    // bind this in your constructor. 
    this.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.handleResponse); 
} 

function getNextAndConcatJSonOrNot(urlToCall, cnt, jsonData, handleResponse){ 
    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 {   
     handleResponse(jsonData); 
    } 
}); 
} 

이와 비슷한 것이 좋습니다.

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 추가 (이)와 데 대해 "이"getNextAnd에서 ... 함수 합격이었다

+0

고마워, 나는 화요일에 그것을 시험해 볼 것이고, 그것이 효과가 있다면 나는 대답을 받아 들일 것이다. – user3659739

+0

나는 당신을 시험해 보았고 나는 일하지 않았다. 그것은 나에게 말한다 : 기능 후에 예기치 않은 토큰. 그럼 "함수"를 제거하고 두 함수에 this.getNextAndConcatJSonOrNot을 넣으려고했습니다. 하지만 getNextAndConcatJSonOrNot은 getNextAndConcatJSonOrNot을 호출 할 때 this.getNextAndConcatJSonOrNot이 함수가 아니라고 알려줍니다. – user3659739