2017-01-25 4 views
1

Ich habe ein Problem mit etwas, das wahrscheinlich ein einfacher Fehler ist.Javascript AJAX Call Scope - Wahrscheinlich dumm

Wie Sie unten sehen werden, habe ich eine Überprüfung auf doppelte Funktion, die externe PHP-Überprüfung einer Datenbank verweist. Das PHP funktioniert und gibt Daten zurück.

Wenn ich duplicationCheck.done() verwende und die Daten parse, reagiert meine if-Anweisung korrekt (dh wenn der Benutzer ein Duplikat eingegeben hat, prüft dies das. HIER ist das Problem: Obwohl meine if-Anweisung unten korrekt funktioniert isDuplicate wird auf "true" gesetzt und erscheint als undefiniert, wenn der Befehl console.log unterhalb der Funktion done() aufgerufen wird. Ich kann nicht herausfinden warum. Bei meiner Recherche denke ich, dass es ein Problem mit der asynchronen Natur des aJAX nennen?

Sie für Ihre Zeit danken. Irgendwelche Ideen?

$("#username_submit").click(function() { 

    function checkForDuplication(username) { 
    return $.ajax({ 
     url: 'static/experiments/computerized_handwriting/random_assignment.php', 
     type: 'POST', 
     data: {userName: username} 
    }); 
    } 

var duplicationCheck = checkForDuplication($('input:text').val()); 


    var isDuplicate; 
    duplicationCheck.done(function(data){ 
     var response = JSON.parse(data); 
     if(response.data['json_array'] == "duplicate"){ 
      isDuplicate = true; 
      alert("dup"); 
     } else { 
     isDuplicate = false; 
     } 
    }); 

    console.log(isDuplicate); 

.... 
+0

Sie können Ereignisse auf bestimmte Elemente schießen möchten, mit [ '.change()'] (https://api.jquery.com/change/) anstatt alles in 1 zu tun. – Xorifelse

+0

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

+0

@Jacob Ich habe das ein paar Mal gelesen, aber ich kann nicht herausfinden, welcher Teil für mein spezifisches Problem relevant ist. Kannst du helfen? –

Antwort

1

Dies ist aufgrund der asynchronen Natur von ajax.

Sie müssen nach der Duplizierung suchen, sobald sie vom Server in der Funktion done zurückgegeben wird. Aber Ihre duplicationCheck-Variable ist kein Verweis auf die Funktion, sondern was sie zurückgibt.

Der richtige Weg, so sein würde:

$("#username_submit").click(function() { 
    $.ajax({ 
    url: 'static/experiments/computerized_handwriting/random_assignment.php', 
    type: 'POST', 
    data: { userName: $('input:text').val()} 
    }).done(function() { 
    var response = JSON.parse(data); 
    if (response.data['json_array'] == "duplicate") { 
     isDuplicate = true; 
     alert("dup"); 
    } 
    else { 
    isDuplicate = false; 
    } 
    console.log(isDuplicate); 
    });//done 
});//submit click 

.... 
+0

Danke! Um die gewünschte Funktionalität zu erreichen, musste ich dies in einen synchronen Anruf umwandeln (ich weiß, irgendwie albern, aber ich benutze normalerweise traditionelle Anrufe). Dein Code hat wirklich geholfen, schätze es! –