2016-12-07 5 views
2

Ich versuche, XPATH Auswertung in mein Formular hinzuzufügen. Wenn der Benutzer XPATH ausfüllt, wird er auf einem Server mit AJAX ausgewertet und gibt dann true oder false zurück. Das Problem ist, dass diese Funktion immer undefined zurückgibt. Ich nehme an, es liegt an asynchronem Verhalten von JS, also habe ich $.when verwendet, aber es hat nicht geholfen.Funktion gibt nichts zurück (async?)

function evalXpath(xpath) { 
    var test = $.post('/api/test-xpath/', {'xpath': xpath}); 
    test.done(function (data) { 
     console.log('BEFORE RETURN '+Boolean(data['success'])); 
     return Boolean(data['success']); 
    }) 
} 

$(document).ready(function() { 
    $('#id_xpath').on('change', function() { 
     var xpath = $("#id_xpath").val(); 
     $.when(evalXpath(xpath)).done(function (evaluated) { 
      console.log('RETURNED '+evaluated); 
      $('#xpath-valid').text(evaluated ? 'VALID' : 'INVALID'); 
     }); 


    }); 

}); 

Die Konsolenausgabe (wie Sie sehen können, ist es noch asynchronious):

enter image description here

Haben Sie irgendwelche Ideen?

Antwort

3

Sie sind wirklich schließen. Ein paar Dinge:

  1. Sie haben vergessen, das Versprechen aus evalXpath zurückzukehren.

  2. richtige Versprechen Wert Verkettungs Um (zum Beispiel für Ihren Wert aus dem Rückruf innerhalb evalXpath um es kehrt der Auflösungswert der Versprechen dann zu werden), then verwendet, nicht done.

  3. Wenn evalXpath verwendet wird, ist $.when nicht erforderlich.

So:

function evalXpath(xpath) { 
    var test = $.post('/api/test-xpath/', {'xpath': xpath}); 
    return test.then(function (data) { 
// ^^^^^^  ^^^^ 
     console.log('BEFORE RETURN '+Boolean(data['success'])); 
     return Boolean(data['success']); 
    }) 
} 

// ... 
evalXpath(xpath).then(function (evaluated) { 
//    ^^^^ (this one could be `done`, but let's be consistent)