Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

>
validator.registerCallback('check_user', function(value) {


var usr = $("#username").val();
var is_ok = "0";

$.ajax({
type: "POST",
url: "check_user.php",
data: "username="+ usr,
success: function(msg){
if (msg == "OK") { is_ok = "1"; }
}});

alert(is_ok);
if (is_ok == "1") { return true; } else { return false; }

});

 

Με ενδιαφέρει η function του registerCallback να γυρνάει true ή false ανάλογα με την απάντηση του check_user.php , τώρα το alert δίνει πάντα 0 και η συνάρτηση επιστρέφει πάντα false....

 

Καμιά ιδέα ; Ευχαριστώ

Δημοσ.
>
validator.registerCallback('check_user', function(value) {


var usr = $("#username").val();
var is_ok;

is_ok = $.ajax({
type: "POST",
url: "check_user.php",
data: "username="+ usr,
success: function(msg){
if (msg == "OK") { return "1"; } else { return "0"; }
}}).responseText;

alert(is_ok);
if (is_ok == "1") { return true; } else { return false; }

});

Δημοσ.

Το callback επιστρέφει πάντα false επειδή το AJAX call είναι asynchronous. Εν συντομία, ο κώδικας που θέτει την τιμή του is_ok σε 1 τρέχει αφότου ολοκληρωθεί το $.ajax ενώ ο κώδικας που ελέγχει το is_ok τρέχει αμέσως μόλις ξεκινήσει το $.ajax. Προφανώς ο έλεγχος γίνεται πρωτού προλάβει να ολοκληρωθεί και γι' αυτό η τιμή που βλέπει είναι πάντα 0 και επιστρέφει false.

 

Εδώ τώρα υπάρχει πρόβλημα γιατί το validate.js που χρησιμοποιείς (έχοντας διαβάσει και το source του στο GitHub), απαιτεί να επιστραφεί από το callback επιτόπου μια τιμή true/false ενώ το callback σου αδυνατεί να κάνει κάτι τέτοιο γιατί το αποτέλεσμα (true/false) θα γίνει γνωστό μόνο όταν ολοκληρωθεί το AJAX call και τρέξει εκείνο το callback με τη σειρά του.

 

Συμπέρασμα: το μόνο που θα μπορούσες να κάνεις είναι να βάλεις την παράμετρο async: false στο $.ajax, στην οποία περίπτωση ο αρχικός σου κώδικας θα δουλέψει. Αυτό όμως σημαίνει ότι ο browser θα "κολλάει" μέχρι να τελειώσει το call και γενικά είναι κάτι το οποίο μπορείς να κάνεις μόνο στη θεωρία (στην πράξη τα προβλήματα που δημιουργεί είναι τέτοια που απαγορεύεται δια ροπάλου).

 

Κατά τα άλλα sorry αλλά ο validator που επιλέγεις δε μπορεί να λειτουργήσει όπως θα ήθελες.

 

Update: στο παρελθόν είχα απαντήσει και σε κάποιο άλλο μέλος σχετικά με το ίδιο κατα βάση θέμα, ίσως θέλεις να δεις και αυτό το thread αν δεν είναι κατανοητά αυτά που έγραψα.

 

@uberalles:

 

Η ιδέα που εφαρμόζεις είναι λάθος. Πρώτον το responseText δεν είναι διαθέσιμο γιατί το call δεν έχει ολοκληρωθεί ακόμα, δεύτερον απ' όσο ξέρω δεν έχει καμία σημασία το τι επιστρέφεις από το success callback και τρίτον δεν έχεις κάνει τίποτα για να αντιμετωπίσεις το πρόβλημα της ασύγχρονης εκτέλεσης.

  • Like 1
Δημοσ.

Ξέχασα να βάλω μία ακόμα γραμμή για αυτό δεν θα παίζει και αυτή είναι η async:false όπως αναφέρει ορθά ο defacer.

 

>
var is_ok;

is_ok = $.ajax({
type: "POST",
url: "ajax.php",
data: "",
async:false,
success: function(msg){
return msg;
}}).responseText;

alert(is_ok);

 

Ο παραπάνω κώδικας, θα σου βάλει στο is_ok ότι επιστρέψει η ajax.php και από εκεί και πέρα το κάνεις ότι θες!

Δημοσ.

Σας ευχαριστώ , το είχα κάνει με async: false ένα 15 μετά το post και δούλεψε , αλλά απο ότι μου λες defacer , θα έχω πρόβλημα...

 

Το check_user.php τρέχει μια select στην βάση μου (η οποία έχει 5 χρήστες προς το παρών) , όταν γίνουν 500.000 τότε θα κολλάει ο browser μέχρι να εκτελεστεί το query και να τρέξει το success , αυτό δεν εννοείς ;

Δημοσ.

Σας ευχαριστώ , το είχα κάνει με async: false ένα 15 μετά το post και δούλεψε , αλλά απο ότι μου λες defacer , θα έχω πρόβλημα...

 

Το check_user.php τρέχει μια select στην βάση μου (η οποία έχει 5 χρήστες προς το παρών) , όταν γίνουν 500.000 τότε θα κολλάει ο browser μέχρι να εκτελεστεί το query και να τρέξει το success , αυτό δεν εννοείς ;

 

Ναι. Γενικά το async: false για πολλούς και διάφορους λόγους θα σου πρότεινα να το αντιμετωπίζεις σαν να μην υπάρχει (εγώ έτσι κάνω).

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...