2016-08-09 20 views
1

ich in einem reagieren app bin und einen Anruf tätigen axios mit:Zugriff auf eine Variable innerhalb einer Rückruf

import axios from 'axios'; 

    export default { 
     getData : function(callback){ 

     var instance = axios.create({ 
      baseURL: '//abc/json', 
      withCredentials: false 
     }); 

     instance.get('') 
      .then((response) => {    
        callback(response.data.abc);     
       }, (error) => { 
        callback(error) 
       }); 
     } 
    } 

In einer anderen Datei, ich folgendes tue:

import file from './file'; 


//class definition... 

    componentDidMount(){ 

     var obj = {} 
     var res = file.getData(function(abc){ 
      obj['abc'] = abc; 
     }); 

     console.log('obj-abc ', obj.abc); //returns undefined 
     } 

Wie oben gezeigt, Ich werde immer undefiniert. Ich möchte grundsätzlich, dass die Variable global verfügbar ist. Ich habe mir andere Vorschläge zu Rückrufen auf dieser Seite angesehen, aber keine von ihnen konnte mir helfen.

Jede Hilfe wäre willkommen.

+1

GetData-Methode ist async und Javascript nicht. Ihre Datei.getData liefert später Ergebnisse, wenn die Konsole bereits gedruckt wird. Fügen Sie einfach console.log ('obj-abc', obj.abc); innerhalb von file.getData und Sie werden sehen, dass alles in Ordnung ist. –

+0

Wenn Sie drucken ** console.log ('obj-abc', obj.abc); ** dann funktioniert es einwandfrei, aber in Ihrem Fall, während es den Wert von obj.abc den Wert zu nicht verfügbar, da getData () ist async Methode und ComponentDidMount() Methode nicht auf vollständige getData() Methode warten. –

Antwort

1

Einfach gesagt

componentDidMount(){ 

var obj = {} 
var res = file.getData(function(abc){ 
    obj['abc'] = abc; 
    console.log('obj-abc ', obj.abc); 
}); 

Da die GetData-Methode ist asynchron, es wird nicht notwendigerweise sequentiell in dem JavaScript-Code ausgeführt werden. Diese Variable ist bereits global, aber wenn Sie sicherstellen möchten, dass Sie sie direkt danach verwenden können, setzen Sie eine Art der Abschlussbedingung, bevor Sie die Codeausführung fortsetzen.

+0

Welche Art von Abschlussbedingung schlagen Sie vor? Ich wollte, dass der Wert global verfügbar ist. – pro

+0

Etwas wie nach console.log, könnten Sie setzen var isGetDataDone = True; und in der anderen Funktion, die Sie einfach setzen, nachdem diese ein ausführen wollen, wenn (isGetDataDone) { } –

-1

Nur um auf JS hier klar zu sein. Blick auf Code

setTimeout(met1, 0); 
console.log("11");  
setTimeout(met2, 0); 
console.log("22"); 

Out Put wird wie dieser Also immer

11 
22 
met1 output 
met2 output 

sein bedenken Sie, dass Asynchron-Code wird in Zukunft und nicht in diesem Moment ausgeführt werden. Wir sparen Ihnen viel Zeit beim Debuggen. Hoffe das hilft.

+0

dass das, was nicht die OP gefragt hat. Überlegen Sie, die Frage zu kommentieren und nicht als Antwort zu posten. –

+0

Ich gebe ihm eine Antwort im Kommentar. Dies ist nur für ihn zu verstehen, warum dieses Problem auftritt. –

Verwandte Themen