2016-04-01 19 views
0

Ich übergebe eine Callback-Funktion wie unten, aber ich bin nicht in der Lage, diese Funktion aufzurufen, wenn onreadystatechange den Wert ändert, also request.onreadystatechange = func. Ich erhalte eine korrekte Antwort vom Server, wenn ich die Ajax-Anfrage aufruft, aber diese Methode wird nicht aufgerufen. Bitte beachten Sie, dass func als String übergeben, wenn ich getFromServer("http://localhost/ch02/checkName.php?username=sas","func")Zuweisen einer Callback-Funktion zu einer Variablen

function createRequest() { 
    try { 
     request = new XMLHttpRequest(); 
    } 
    catch (failed) { 
     request = null; } 
    finally { 
     return request; 
    } 
} 

function func(){ 
    alert("ok"); 
} 

function getFromServer(url,readystateCallback) { 
    request=createRequest(); 
    if (request == null) { 
     alert("unable to create request"); 
    } else { 
     request.open("GET", url, true); 
     var func= new Function (readystateCallback); 
     request.onreadystatechange = func; 
     request.send(null); 
    } 
    return request; 
} 
+0

Ich will nicht Klammer hier mit readystateCallback verwenden. Es sollte nur ausgeführt werden, wenn die Anforderung ihren Status ändert. –

+0

mein schlecht, das ist ein Fehler war, löschte den Kommentar ... Ich meinte: 'request.onreadstatechange = readystateCallback' – JordanHendrix

+1

eine anonyme Funktion verwenden: ' request.onreadystatechange = function() {// hier etwas tun - Sie können hier einen Funktionsaufruf stellen. } ' Was Sie in Ihrem Beispiel tun, besteht darin, eine Zeichenfolge zu übergeben und dann den Rückruf einem Zeichenfolgewert zuzuweisen, anstatt einen tatsächlichen Funktionsaufruf zu tätigen. – Korgrue

Antwort

1

nennen Wenn die Funktion im globalen Bereich definiert ist, wird es dem window Objekt hinzugefügt werden, so dass Sie tun können:

var func = window[readystateCallback]; 

Aber anstatt davon abhängig zu sein, sollten Sie Ihr eigenes Objekt erstellen, das Funktionsnamen Funktionen zuordnet. Auf diese Weise können Sie auf Funktionen in einem lokalen Bereich zugreifen, und Sie können auch nicht versehentlich eine unerwartete Funktion als Rückruf aufrufen.

function func() { 
    alert("ok"); 
} 
function otherfunc() { 
    alert("really great"); 
} 
... 

var callbacks = { 
    "func": func, 
    "otherfunc": otherfunc, 
    ... 
} 

Dann können Sie tun:

function getFromServer(url,readystateCallback) { 
    request=createRequest(); 
    if (request == null) { 
     alert("unable to create request"); 
    } else { 
     request.open("GET", url, true); 
     var func= callbacks[readystateCallback]; 
     request.onreadystatechange = func; 
     request.send(null); 
    } 
    return request; 
} 

Aber die wirkliche, beste Lösung ist, nicht den Namen einer Funktion in erster Linie passieren. Einfach die Funktion selbst übergeben, so funktionieren praktisch alle Javascript-Interfaces, die Callbacks verwenden. So können Sie es auf diese Weise nennen sollte:

getFromServer("http://localhost/ch02/checkName.php?username=sas", func); 

Dann Sie einfach tun:

request.onreadystatechange = readystateCallback; 
+0

Das Problem mit diesem Ansatz ist, dass getFromServer in meiner Utilities-Bibliothek für häufig verwendete Funktionen ist. Callbacks werden keine Ahnung haben, welche anderen Name-Wert-Paare in Zukunft benötigt werden. Nur das Modul in meinem aktuellen Projekt kennt den Funktionsnamen und die Funktion selbst ist nur in diesem Projekt definiert. Jedes andere Projekt hat eine eigene Callback-Funktion. –

+0

Warum übergeben Sie Funktionsnamen als Zeichenfolgen anstelle der Funktion selbst? – Barmar

+0

Ich übergebe Funktionsnamen als Zeichenfolgen für Lesbarkeit. Es muss eine Möglichkeit geben, die Funktion aus der Zeichenfolge aufzurufen. –

Verwandte Themen