2017-12-21 11 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

[OK]を、最大の答えの助けを借りて、私は解決策を見つけました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

私はあなたの方法を試して、私は働いていない。 それは私に言う:機能の後の予期しないトークン。 それから、私は "function"を取り除き、両方の関数にthis.getNextAndConcatJSonOrNotを入れようとしました。 しかし、getNextAndConcatJSonOrNotをgetNextAndConcatJSonOrNotで呼び出すと、this.getNextAndConcatJSonOrNotが関数ではないことがわかります。 – user3659739

関連する問題