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

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

Δημοσ.

Αδέρφια μου, αλήτες, πουλιά.

 

Έχω ένα ajax statement και αφού όλα πάνε καλά, στο τμήμα complete έχω..

complete: function(){

   /// GUI stuff

   /// GUI stuff

   /// GUI stuff

   asyncSetTimeout(ReturnToOverview(), 3000));

}

 

αφού λοιπόν εμφανίσω κάποια δεδομένα, θέλω μετά από 3 δευτερόλεπτα ένα redirection. Με την παλιά καλή setTimeout αυτό που συμβαίνει είναι ότι με το παίρνω απάντηση, παγώνει το σύμπαν για 3 δευτερόλεπτα και μετά γίνεται το redirection. Κοινώς δεν βλέπω ποτέ τις αλλαγές στο GUI που έγιναν πριν την setTimeout..

 

Το λοιπόν, αν έχω καταλάβει καλά το όλο θέμα είναι ότι η setTimeout είναι σύγχρονοι με τις υπόλοιπες εντολές. Υπάρχει τρόπος να τρέξει ασύγχρονα;

Δημοσ.

Η setTimeout είναι εξ ορισμού ασύγχρονη. Δεν ξέρω τι κάνεις λάθος μέσα στη ReturnToOverview (γιατί το κόλλημα που λες δεν εξηγείται διαφορετικά), αλλά είναι σχεδόν σίγουρο ότι έχεις λάθος στη setTimeout αν την έχεις γράψει όπως παραπάνω. Αντί να περάσεις μια αναφορά σε function, εδώ καλείς τη function επιτόπου και περνάς την επιστρεφόμενη τιμή της.

Δημοσ.

Η setTimeout είναι εξ ορισμού ασύγχρονη. Δεν ξέρω τι κάνεις λάθος μέσα στη ReturnToOverview (γιατί το κόλλημα που λες δεν εξηγείται διαφορετικά), αλλά είναι σχεδόν σίγουρο ότι έχεις λάθος στη setTimeout αν την έχεις γράψει όπως παραπάνω. Αντί να περάσεις μια αναφορά σε function, εδώ καλείς τη function επιτόπου και περνάς την επιστρεφόμενη τιμή της

 

Όντως αυτό κάνω!!! Κάτσε να τσεκάρω

 

edit:

 

Είσαι μεγάλος ρε defacer...

 

Παίζει να ρίξεις και μια ξήγα στο τι διαφορά έχει το

setTimeout(Return(), 3000);

από το

setTimeout(function() { Return(); }, 3000);

Δημοσ.

Παίζει να ρίξεις και μια ξήγα στο τι διαφορά έχει το

setTimeout(Return(), 3000);

από το

setTimeout(function() { Return(); }, 3000);

 

Αυτό που περνάς στη setTimeout πρέπει να είναι ένα callback (σχετική απάντηση στο SO αν δεν ξέρεις τον όρο).

 

Στη δεύτερη περίπτωση όντως περνάς ένα callback: μια συνάρτηση που όταν κληθεί θα καλέσει με τη σειρά της τη Return. Οπότε η Return θα κληθεί μετά από 3s.

 

Στην πρώτη περίπτωση κάνεις κάτι τελείως διαφορετικό: καλείς επιτόπου τη Return και περνάς την επιστρεφόμενη τιμή της (που υποτίθεται πως είναι callback γιατί αυτό περιμένει η setTimeout) στη setTimeout. Οπότε η Return θα κληθεί επιτόπου και μετά από 3s η setTimeout θα προσπαθήσει να καλέσει ό,τι επέστρεψε η Return, κατά πάσα πιθανότητα αποτυγχάνοντας.

 

Υπόψιν πως μπορείς αυτό που γίνεται στην πρώτη περίπτωση κατα λάθος να το κάνεις επίτηδες και να είναι σωστό, αν έχεις μια function που επιστρέφει function, π.χ.

 

function Return() {

    console.log("This happens immediately");

    return function() {     console.log("This happens after the timeout has elapsed."); }

}

 

Απλά αυτή η δομή κώδικα δεν είναι κάτι που βλέπεις από αρχάριους, οπότε σε αρχάριο επίπεδο αν δεις setTimeout(Return(), ...) είναι στάνταρ λάθος.

 

Τέλος, η δεύτερη περίπτωση (που είναι αυτό που θες να κάνεις εδώ) μπορεί να γραφεί απλούστερα ως

 

setTimeout(Return, 3000); // χωρίς παρενθέσεις

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

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

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

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

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

Σύνδεση

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

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