iXdi - Σύγχρονος προγραμματισμός

Παύση έως ότου κληθεί επανάκληση, σε Javascript

Είμαι αρκετά νέος στον προγραμματισμό τύπου callback σε javascript. Υπάρχει τρόπος να αναγκαστεί ο κωδικός να περιμένει μέχρι να ολοκληρωθεί μια κλήση λειτουργίας μέσω μιας επανάκλησης; ΑΣΕ με να εξηγήσω. Η παρακάτω συνάρτηση παίρνει έναν αριθμό και επιστρέφει ένα αποτέλεσμα με βάση αυτόν.

function get_expensive_thing(n) {
  return fetch_from_disk(n);
}

Μέχρι εδώ, αρκετά εύκολο. Τι κάνω όμως όταν το fetch_from_disk επιστρέφει το αποτέλεσμά του μέσω επανάκλησης; Όπως έτσι:

function get_expensive_thing(n) {
  fetch_from_disk(n, function(answer) {
    return answer; // Does not work
  });
}

Τα παραπάνω δεν λειτουργούν επειδή το return βρίσκεται στο πεδίο εφαρμογής της ανώνυμης συνάρτησης και όχι στη συνάρτηση get_expensive_thing.

Υπάρχουν δύο πιθανές «λύσεις», αλλά και οι δύο είναι ανεπαρκείς. Το ένα είναι να επαναπροσδιορίσει το get_expensive_thing στον εαυτό του να απαντήσει με μια επανάκληση:

function get_expensive_thing(n, callback) {
  fetch_from_disk(n, function(answer) {
    callback(answer);
  });
}

Το άλλο είναι να επανακωδικοποιήσετε fetch_from_disk, αλλά αυτό δεν αποτελεί επιλογή.

Πώς μπορούμε να επιτύχουμε το επιθυμητό αποτέλεσμα διατηρώντας την επιθυμητή συμπεριφορά του get_expensive_thing -- δηλαδή, να περιμένουμε μέχρι ο fetch_from_disk να καλέσει την επανάκληση και μετά να επιστρέψει αυτήν την απάντηση;

29.06.2010

Απαντήσεις:


1

Σχεδόν δεν υπάρχει "αναμονή" στο πρόγραμμα περιήγησης Javascript. Είναι όλα σχετικά με τις επανακλήσεις. Θυμηθείτε ότι οι επανακλήσεις σας μπορεί να είναι "closures", που σημαίνει ορισμούς συναρτήσεων που "συλλαμβάνουν" τοπικές μεταβλητές από το περιβάλλον στο οποίο δημιουργήθηκαν.

Θα είστε πιο ευτυχισμένοι αν υιοθετήσετε αυτόν τον τρόπο να κάνετε τα πράγματα.

29.06.2010
  • Ακόμα κι αν μπορούσατε να περιμένετε, ζητάτε ένα πρόγραμμα περιήγησης που δεν αποκρίνεται κάνοντας αυτό. 30.06.2010
  • Αυτό είναι αρκετά δίκαιο. Ο σκοπός μου εδώ ήταν να διαπιστώσω με βεβαιότητα ότι είναι στην πραγματικότητα αδύνατο να δημιουργήσω μια συνάρτηση που επιστρέφει μια τιμή που έλαβε μέσω μιας επιστροφής κλήσης. 30.06.2010

  • 2

    προσθέστε αυτήν την επιστροφή που λείπει :)

    function get_expensive_thing(n) {
      return fetch_from_disk(n, function(answer) {
        return answer;
      });
    }
    
    29.06.2010
  • Ίσως δεν το διευκρίνισα: σε εκείνο το παράδειγμα, ο fetch_from_disk είχε αλλάξει τη συμπεριφορά του για να επιστρέψει το αποτέλεσμα μέσω επανάκλησης. Άρα η τιμή επιστροφής του είναι στην πραγματικότητα undefined. 30.06.2010
  • το διευκρινίσατε, ωστόσο πολλοί άνθρωποι επιστρέφουν επίσης το αποτέλεσμα της επανάκλησης, σκεφτείτε το fetch_from_disk(n,c) { return c(val) } - συγγνώμη αν αυτό ήταν θόρυβος :) 30.06.2010
  • Νέα υλικά

    Code Smell 210 - Dynamic Properties
    Η τεμπελιά και η μαγεία φέρνουν ελαττώματα TL;DR: Να είστε ξεκάθαροι με τα χαρακτηριστικά σας Προβλήματα Ευανάγνωστο Ορισμός πεδίου εφαρμογής Απαρατήρητα τυπογραφικά λάθη..

    Οπτικοποίηση δεδομένων με γραφήματα Google
    του Ejiro Thankgod Η οπτικοποίηση δεδομένων είναι μια εξαιρετική προσέγγιση για την εμφάνιση δεδομένων και τη συμμετοχή κοινού. Ο ανθρώπινος νους είναι συχνά καλύτερος στο να θυμάται..

    Το όνομά μου είναι Abdul Qudus.abd
    Το όνομά μου είναι Abdul Qudus.abd Είμαι διαδικτυακός συγγραφέας και γράφω άρθρα. Έχω 3ετή εμπειρία στη διαδικτυακή συγγραφή. οπότε θα είμαι ο καλύτερος συγγραφέας στην πλατφόρμα σας. είμαι ο..

    Το Python Selenium Web Scraping σας κατέβασε το 2023; Εκκαθαρίστε την προσωρινή μνήμη και ενισχύστε τα αποτελέσματά σας!
    Η απόξεση ιστού με το Python Selenium είναι ένα εξαιρετικό εργαλείο για την εξαγωγή δεδομένων από ιστοσελίδες. Ωστόσο, περιστασιακά, οι ιστοσελίδες ενδέχεται να αποτύχουν να φορτώσουν ή να..

    Έννοιες JavaScript που πρέπει να γνωρίζετε για να ξεκινήσετε με το React
    Αφού είδα αυτή την ερώτηση να τίθεται αμέτρητες φορές, πιστεύω ότι μπορεί να είναι χρήσιμο σε πολλούς ανθρώπους εκεί έξω να έχουν μια σαφή κατανόηση του τι χρειάζεται να είναι γνωστό στο..

    Χρήση της C++ ως γλώσσας δέσμης ενεργειών, μέρος 8
    Βελτίωση κλήσεων λειτουργιών API με χρήση ενσωματωμένης συναρμολόγησης Έχω πειραματιστεί με την ενσωματωμένη συναρμολόγηση στο παρελθόν με κάποια επιτυχία. Είναι περίπλοκο και εύκολο να κάνεις..

    5 αμυχές που πρέπει να γνωρίζετε για να γίνετε σπουδαίος προγραμματιστής.
    5 αμυχές που πρέπει να γνωρίζετε για να γίνετε σπουδαίος προγραμματιστής. Αυτές τις μέρες, πολλοί φιλοδοξούν να εργαστούν ως προγραμματιστές. Αλλά το να γίνεις σπουδαίος προγραμματιστής δεν..