2016-08-08 7 views
-1

Wert ist nicht ersetzen und Funktion zurückgeben 0. Wie es zu beheben? (reagieren-native 0,30, IOS 10.0 Simulator)Wie kann ich XMLHttpRequest Antwort von Funktion zurückgeben?

export function getCategoryList() { 
 
    var xhr = new XMLHttpRequest(); 
 
    jsonResponse = null; 
 

 
    xhr.onreadystatechange = (e) => { 
 
    if (xhr.readyState !== 4) { 
 
     return; 
 
    } 
 

 
    if (xhr.status === 200) { 
 
     console.log('SUCCESS', xhr.responseText); 
 
     jsonResponse = JSON.parse(xhr.responseText); 
 
    } else { 
 
     console.warn('request_error'); 
 
    } 
 
    }; 
 

 
    xhr.open('GET', 'https://httpbin.org/user-agent'); 
 
    xhr.send(); 
 

 
    return jsonResponse; 
 
}

+0

Die Anforderung ist asynchron, was bedeutet, dass die Anforderung, gesendet wird Ihre Funktion gibt einen Nullwert und dann abgeschlossen einige Zeit später wird die Anfrage. Sehen Sie sich eine Callback-Funktion in 'getCategoryList()' (einfach) oder verspricht (etwas schwieriger, aber nicht viel). – Archer

+5

Lesen: http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call – Cherniv

+0

Sie sollten nach [Versprechen] suchen (https: //developer.mozilla .org/de-DE/docs/Web/JavaScript/Referenz/Global_Objects/Promise) –

Antwort

1

Sie können nicht den Wert wie das zurück.

Ich würde vorschlagen, entweder mit Rückrufe oder Versprechungen gehen:

Rückruf:

function getCategoryList(callback) { 
 
    var xhr = new XMLHttpRequest(); 
 

 
    xhr.onreadystatechange = (e) => { 
 
    if (xhr.readyState !== 4) { 
 
     return; 
 
    } 
 

 
    if (xhr.status === 200) { 
 
     console.log('SUCCESS', xhr.responseText); 
 
     callback(JSON.parse(xhr.responseText)); 
 
    } else { 
 
     console.warn('request_error'); 
 
    } 
 
    }; 
 

 
    xhr.open('GET', 'https://httpbin.org/user-agent'); 
 
    xhr.send(); 
 
} 
 

 
getCategoryList(data => console.log("The data is:", data));

Versprechungen:

function getCategoryList() { 
 
    var xhr = new XMLHttpRequest(); 
 

 
    return new Promise((resolve, reject) => { 
 

 
    xhr.onreadystatechange = (e) => { 
 
     if (xhr.readyState !== 4) { 
 
     return; 
 
     } 
 

 
     if (xhr.status === 200) { 
 
     console.log('SUCCESS', xhr.responseText); 
 
     resolve(JSON.parse(xhr.responseText)); 
 
     } else { 
 
     console.warn('request_error'); 
 
     } 
 
    }; 
 

 
    xhr.open('GET', 'https://httpbin.org/user-agent'); 
 
    xhr.send(); 
 
    }); 
 
} 
 

 
getCategoryList().then(res => console.log("The result is", res));

0

Sie können die Anforderungsantwort zurückgeben, wenn XHR synchron ist (xhr.open('GET', 'https://httpbin.org/user-agent', false)) und eine Endlosschleife ausführt, die bricht, wenn die Anforderung abgeschlossen ist.

Anmerkungen:

  • Synchrone XHR ist veraltet;
  • Unendlich Schleife wird die Seite stoppen, während XHR nicht beendet ist (z. B. ein Spiel).

function getCategoryList() { 

    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", "https://httpbin.org/user-agent", false); 
    xhr.send(); 

    // stop the engine while xhr isn't done 
    for(; xhr.readyState !== 4;) 

    if (xhr.status === 200) { 

     console.log('SUCCESS', xhr.responseText); 

    } else console.warn('request_error'); 

    return JSON.parse(xhr.responseText); 
} 
+1

Synchrone http Anfragen werden nicht unterstützt – iwasmusic

+0

@iwasmusic Sie sind, aber veraltet, dann werden sie in der Zukunft entfernt werden. Das ist, was Sie wollten ("Wie kann ich XMLHttpRequest Antwort von ... zurückgeben"). – Hydro

Verwandte Themen