2017-03-12 2 views
0

Ich verwende jQuery in einem Discord-Javascript-Bot, und irgendwann hole ich Daten aus dem Internet, um eine Zeichenfolge aus den abgerufenen Daten zu erstellen.Daten können nicht aus der JSON-Funktion abgerufen werden

es hier, wie es aussieht:

var jsonFinal = ''; 
var oembed_url = 'http://backend.deviantart.com/oembed?url=http%3A%2F%2Ffav.me%2Fd2enxz7&format=jsonp&callback=?'; 
$.getJSON(oembed_url, function(data) { 
    jsonFinal = "("+data.author_name+")\n"+data.url; 
     console.log(jsonFinal); 
    }); 

console.log(jsonFinal): 

Wie Sie sehen können, die var „jsonFinal“, die am Ende alle Daten enthalten soll, leer initialisiert. Aber was tatsächlich passiert, ist, dass das jsonFinal die gewünschte Information bei der ersten console.log enthält (innerhalb der Funktion), aber bei der zweiten console.log wieder Null wird [es zeigt nichts an].

Das bedeutet entweder die Variable jsonFinal wird zwischen den beiden console.log abgewischt, oder das sind zwei verschiedene Variablen mit den gleichen Namen: aber ich bekomme nicht die Informationen aus "jsonFinal" aus der Funktion .getJson.

Wie kann ich tun?

+1

Mögliches Duplikat [Wie kann ich die Antwort von einem asynchronen Aufruf zurückkehren?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchroner Anruf) –

+0

http://stackoverflow.com/questions/10456410/global-variable-in-javascript-not-set-when-using-getjson –

+0

http://stackoverflow.com/questions/3537434/cant- get-correct-return-value-from-ein-jquery-ajax-call –

Antwort

2

Dies ist, weil $.getJSON asynchron ist.

Die zweite Instanz von console.log(jsonFinal): läuft vor der ersten.

Um die Info "aus der Funktion heraus" zu bekommen, müssen Sie entweder eine Funktion von innerhalb $.getJSON aufrufen, oder Ihre Arbeit darin erledigen.

$.getJSON(oembed_url, function(data) { 
    jsonFinal = "("+data.author_name+")\n"+data.url; 
    fromInside(jsonFinal); 
    }); 

function fromInside(data) {...} 

Oder Sie können Promises verwenden, Generatoren, Async/Await usw. je nachdem, welche Version von Node.js Sie verwenden, und wenn Sie/verwenden, nicht babel.

Sie können node-fetch (für einen vielversprechenden Stil) verwenden.

fetch(oembed_url) 
.then(res => res.json()) 
.then(jsonFinal => { 
    console.log(jsonFinal) 
}) 

Wenn Sie v7 Node.js verwenden, entsperren async/await hinter der Harmonie Flagge.

node --harmony-async-await app.js

Dann können Sie tatsächlich das Programm machen „Warten auf jsonFinal einen Wert haben“ - aber nur innerhalb einer Funktion.

async function getJSON(oembed_url) { 
    let response = await fetch(oembed_url) 
    let jsonFinal = await response.json() 
} 
+0

Das sieht vielversprechend aus und ich werde es versuchen.Da es sich jedoch um einen Diskord-Bot handelt, der NodeJS und keinen Browser verwendet, sind synchrone Methoden, die einige Zeit benötigen, überhaupt kein Problem. Gibt es eine Möglichkeit, das Programm "warten zu lassen, bis jsonFinal einen Wert hat"? – Rackover

+0

Beachten Sie, dass "ab jQuery 1.5 das von' $ .getJSON() '' zurückgegebene jQuery-XHR-Objekt die 'Promise'-Schnittstelle implementiert, die alle Eigenschaften, Methoden und das Verhalten einer'Versprechung' enthält." – Whymarrh

+0

@Rackover, aktualisiert. @Whymarrh, sicher. Aber falls er '' '.getJSON()' Methode nur 'jQuery' verwendet (sehr wahrscheinlich), kann er seine jQuery Abhängigkeit für etwas wie' node-fetch' löschen. –

1

Wie @Raphael erwähnt; Sie können es erreichen, indem sie diese mit:

$.ajax({ 
    url: url, 
    dataType: 'json', 
    async: false, 
    data: mydata, 
    success: function(data) { 
    //stuff 
    //... 
    } 
    }); 
+0

Es ist eine [** sehr schlechte ** Idee] (http://stackoverflow.com/questions/8026191/cani-i-use-jquery-getscript-witound-a-callback/8026693#8026693) synchrone XHR zu verwenden Anrufe. * Irgendwann wird es den Browser sperren *, Frustration für den Endbenutzer verursachen. –

1

$ .getJSON ist asynchrone Methode ... So Außen console.log wird, bevor der Dienst gibt Daten ausgeführt zu werden.

$ .getJSON Rückgabeversprechen Objekt. Sie können die Methode done verwenden, um einige Aktionen nach dem Serviceanruf auszuführen.

$.getJSON(oembed_url, function(data) { 
    jsonFinal = "("+data.author_name+")\n"+data.url; 
     console.log(); 
    }).done(function() { 
    console.log(jsonFinal); 
    }); 
Verwandte Themen