2017-06-27 4 views
0

Ich habe diesen Artikel bereits gelesen How do I return the response from an asynchronous call? Jedoch konnte ich keine Lösung finden. Ich mache eine Ajax-AnfrageDaten von der Ajax-Anfrage erhalten angezeigt

function getdata(url) 
{ 
console.log('Started'); 
jQuery.ajax({ 
type: "GET", 
url: "http://myserver.com/myscript.php", 
dataType: "json", 
error: function (xhr) { 
    console.log('Error',xhr.status); 
     }, 
success: function (response) { 
    console.log('Success',response); 

     } 
    }); 
} 

und Konsole zeigt alles in Ordnung, aber wenn ich sage,

var chinese = getdata(); 

die Daten zu erhalten. Ich erhalte:

Uncaught TypeError: Cannot read property 'length' of undefined error for this line

var text = chinese[Math.floor(Math.random()*chinese.length)]; 

Kann mir hier jemand helfen?

+0

können Sie mir zeigen die Ausgabe? –

+0

Sie geben "response" an die Konsole aus und speichern keine Variablen. –

+0

Sie sollten 'return' vor 'jQuery.ajax()' –

Antwort

1

Das Problem besteht darin, dass Sie eine asynchrone Methode verwenden, die ein synchrones Ergebnis erwartet.

Deshalb sollten Sie den Code in das Ergebnis des asynchronen Aufruf wie folgt verwendet werden:

function getdata(url) { 
    console.log('Started'); 
    jQuery.ajax({ 
    type: 'GET', 
    url: url, 
    dataType: 'json', 
    error: function(xhr) { 
     console.log('Error', xhr.status); 
    }, 
    success: function(chinese) { 
     var text = chinese[Math.floor(Math.random()*chinese.length)]; 
     // Do something else with text 
    } 
    }); 
} 

getData('http://myserver.com/myscript.php'); 

Ich hoffe, es hilft :)

+0

Nice Thank you Mann. Es hat tatsächlich funktioniert. Ich dachte über so viele Tage nach. – erik7

0

Der Fehler, den Sie erhalten, liegt an der asynchronen Art des Anrufs. Ich schlage vor, dass Sie den Wert zuweisen, nachdem Sie die Erfolg-Antwort von der API wie unten erhalten haben.

var chinese = getdata(); 

Dann ist die Funktion getdata() wird wie

function getdata(url) 
{ 
console.log('Started'); 
jQuery.ajax({ 
type: "GET", 
url: "http://myserver.com/myscript.php", 
dataType: "json", 
error: function (xhr) { 
    console.log('Error',xhr.status); 
     }, 
success: function (response) { 
    initChinese(response.data); 

     } 
    }); 
} 

sein und eine Funktion initChinese() wie

var text; 
function initChinese(chinese){ 
text = chinese[Math.floor(Math.random()*chinese.length)]; 
} 

Sie können auch die text Variable im globalen Bereich erklären erstellen und dann den Wert zuweisen text Variable innerhalb der success Funktion, ohne eine neue Funktionerstellen zu müssen.

0

Das Problem ist, Ihre Getdata-Funktion gibt nichts zurück. In Ihrer getdata-Funktion führen Sie eine Ajax-Anfrage aus, die eine asynchrone Anfrage ist. Die von Ihnen angeforderten Daten werden nicht zurückgegeben und können nicht mit Ihrer getdata-Funktion zurückgegeben werden.

Aber Sie werden die angeforderten Daten in Ihren Erfolg Funktion haben:

function getdata(url) 
{ 
console.log('Started'); 
jQuery.ajax({ 
type: "GET", 
url: "http://myserver.com/myscript.php", 
dataType: "json", 
error: function (xhr) { 
    console.log('Error',xhr.status); 
     }, 
success: function (response) { 
    console.log('Success',response); 
var text = response[Math.floor(Math.random()*response.length)]; 
     } 
    }); 
} 

Da ich nicht in der Lage bin Ihr Code zu testen, haben Sie auf Ihrem eigenen, den Rest zu debuggen. Aber die Antwortvariable ist höchstwahrscheinlich Ihre "chinesische" Variable.

0

Sie versuchen, Rückrufe verwenden könnte oder Sie Promises aussehen könnte.

Die Idee mit Rückrufen besteht darin, dass Sie eine Funktion übergeben, die ausgeführt wird, nachdem die Ajax-Anforderung abgeschlossen ist. Dieser Callback kann einen Parameter akzeptieren, in diesem Fall die Antwort.

Mit Rückrufe:

function getData(url, successCallback, errorCallback) { 
 
    console.log('Started'); 
 

 
    jQuery.ajax({ 
 
    type: "GET", 
 
    url: url, 
 
    dataType: "json", 
 
    error: function(xhr) { 
 
     errorCallback(xhr.status); 
 
    }, 
 
    success: function(response) { 
 
     successCallback(response); 
 
    } 
 
    }); 
 
} 
 

 
var chinese; 
 

 
getData("http://myserver.com/myscript.php", function(response) { 
 
    chinese = response; // you can assign the response to the variable here. 
 
}, function(statusCode) { 
 
    console.error(statusCode); 
 
});

Mit Promises (< IE11 dies nicht unterstützt):

function getData(url) { 
 
    return new Promise(function(resolve, reject) { 
 
    console.log('Started'); 
 
    
 
    jQuery.ajax({ 
 
     type: "GET", 
 
     url: url, 
 
     dataType: "json", 
 
     error: function(xhr) { 
 
     reject(xhr.status); 
 
     }, 
 
     success: function(response) { 
 
     resolve(response); 
 
     } 
 
    }); 
 
    }); 
 
} 
 

 
var chinese; 
 

 
getData("http://myserver.com/myscript.php").then(function(response) { 
 
    chinese = response; 
 
    console.log(chinese); 
 
}, function(statusCode) { 
 
    console.error(statusCode); 
 
});

+0

Als ich diese Code-Konsole benutzt, gibt mir das angefangen aber dann kommt da nichts. Wenn ich versuche, die Funktion getata() aufzurufen, von der Konsole sagt es, dass es nicht definiert ist, irgendwelche Ideen? – erik7

+0

Welchen Code haben Sie benutzt? Wie hast du es benutzt? – Corsin

+0

Der asynchrone Aufruf wurde synchron gemacht. Ich habe die Antwort von ajimix genommen, weil ich die Funktion aufrufen konnte, nachdem die Ajax-Anfrage initialisiert und die Daten benutzt hatte – erik7