2010-12-04 5 views
0

Bedenken Sie:Daten von anonymen, asynchronen Funktionen zurückgeben?

function ajaxCall(url, callback) { 
    $.ajax({ 
     type: "GET", 
     url: url, 
     success: function (data) { // <-- fail point: where does the returned data go, now? 
      // do stuff with data 
      if (callback) { 
       var ret = callback(); 
       if (ret !== undefined) { 
        return ret; 
       } 
      } 
     } 
    }); 
} 

function fooBar() { 
    return ajaxCall('some/url', function() { 
     // do stuff 
     return some_value; 
    } 
} 

rechts, so dass im Grunde habe ich die asynchronousness des Antrags erhalten will damit der Browser nicht hängt nicht, aber immer noch einen Wert am Ende zurückkehren ... Dies ist ein vereinfachtes Beispiel ist, obwohl ich es wahrscheinlich noch mehr vereinfachen könnte. Das einzige Hindernis, das ich sehe, ist der Übergang zwischen $.ajax und seiner anonymen Funktion success:.

Hmph.

+0

Warten Sie, das ist nicht einmal gültige JavaScript ... –

+0

Ja, tut mir leid. Das '$ .ajax' konnte nicht von mir auf den Bildschirm übertragen werden. –

+0

Ah, ich verstehe. Es muss ein Copy-Paste-Fehler aufgetreten sein. :) –

Antwort

3

Sie können die Aufrufe nicht asynchron so verwenden, die Callbacks laufen später, nachdem Ihre aufrufende Funktion längst zurückgegeben wurde. Statt dessen, was Sie tun müssen, ist die Funktion aufrufen, die die Daten als Teil der (oder die gesamte) Rückruf, zum Beispiel benötigt:

function ajaxCall(url, callback) { 
    $.ajax({ 
    type: "GET", 
    url: url, 
    success: callback 
    }); 
} 

function fooBar() { 
    ajaxCall('some/url', function (data) { 
     functionThatNeedsData(data); 
    }); 
} 

Das ist nur ein Beispiel zu zeigen, was in der Praxis vor sich geht, könnte es nur sein:

function fooBar() { 
    $.get('some/url', functionThatNeedsData); 
} 

Dies ruft nur Ihre functionThatNeedsData, die die Daten aus der Anforderung als erstes Argument bekommt ... so, sobald der Server mit Daten antwortet, werden Sie es auf vorbei, wo es tun muss, und den Rest deiner Arbeit mit diesen Daten zu erledigen.

+0

Aber * ich will diese Funktion, um Daten * zurückzugeben! Naja, ich muss es nur auf die lange Strecke machen ... –

+3

@passcod - Ich bin mir nicht sicher, was ich sagen soll ... so funktionieren asynchrone Anrufe, wenn du zurückkommen könntest, wären sie synchron :) –

+0

Genau. Aber jetzt muss ich mehr Asyncness hinzufügen, um zu bekommen, was ich will ... d. H. Benutzerdefinierte Ereignisse. Diese Antwort ist jedoch korrekt. –