577 Stimmen

Wie gibt man den Wert einer asynchronen Callback-Funktion zurück?

Diese Frage wird in SO oft gestellt. Aber ich kann immer noch keine Sachen bekommen.

Ich möchte einen Wert von Callback erhalten. Schauen Sie sich das Skript unten für die Klärung.

function foo(address){

      // google map stuff
      geocoder.geocode( { 'address': address}, function(results, status) {
          results[0].geometry.location; // I want to return this value
      })

    }
    foo(); //result should be results[0].geometry.location; value

Wenn ich versuche, diesen Wert zurückzugeben, bekomme ich nur "undefiniert". Ich folgte einige Ideen von SO, aber schlägt immer noch fehl.

Diese sind:

function foo(address){
    var returnvalue;    
    geocoder.geocode( { 'address': address}, function(results, status) {
        returnvalue = results[0].geometry.location; 
    })
    return returnvalue; 
}
foo(); //still undefined

556voto

Sean Kinsey Punkte 36651

Dies ist nicht möglich, da Sie nicht von einem asynchronen Aufruf innerhalb einer synchronen Methode zurückkehren können.

In diesem Fall müssen Sie einen Callback an foo übergeben, der den Rückgabewert erhält

function foo(address, fn){
  geocoder.geocode( { 'address': address}, function(results, status) {
     fn(results[0].geometry.location); 
  });
}

foo("address", function(location){
  alert(location); // this is where you get the return value
});

Wenn ein innerer Funktionsaufruf asynchron ist, dann müssen alle Funktionen, die diesen Aufruf "umhüllen", ebenfalls asynchron sein, um eine Antwort "zurückgeben" zu können.

Wenn Sie viele Rückrufe haben, könnten Sie den Schritt wagen und eine Versprechensbibliothek wie Q .

33voto

Pointy Punkte 387467

Es macht keinen Sinn, Werte aus einem Rückruf zurückzugeben. Führen Sie stattdessen die "foo()"-Arbeit aus, die Sie erledigen wollen innerhalb Ihren Rückruf.

Asynchrone Callbacks werden vom Browser oder von einem Framework wie der Google Geocoding-Bibliothek aufgerufen, wenn Ereignisse eintreten. Es gibt keinen Platz für die zurückgegebenen Werte. Eine Rückruf-Funktion puede einen Wert zurückgeben, aber der Code, der die Funktion aufruft, wird sich nicht um den Rückgabewert kümmern.

16voto

Alex Heyd Punkte 1323

Wenn Sie zufällig jQuery verwenden, sollten Sie das vielleicht einmal ausprobieren: http://api.jquery.com/category/deferred-object/

Sie ermöglicht es Ihnen, die Ausführung Ihrer Callback-Funktion zu verschieben, bis die Ajax-Anfrage (oder eine andere asynchrone Operation) abgeschlossen ist. Dies kann auch verwendet werden, um einen Callback aufzurufen, wenn mehrere Ajax-Anfragen abgeschlossen sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X