Ανάγνωση στα Αγγλικά

Κοινή χρήση μέσω


Μοτίβο επανάληψης αναμονής

Σε ορισμένες περιπτώσεις, η συμπεριφορά μιας προέλευσης δεδομένων δεν συμφωνεί με αυτή που αναμένεται από τον προεπιλεγμένο χειρισμό κώδικα HTTP του Power Query. Τα παρακάτω παραδείγματα δείχνουν πώς μπορείτε να επιλύσετε αυτή την κατάσταση.

Σε αυτό το σενάριο θα εργάζεστε με ένα REST API που επιστρέφει περιστασιακά έναν κωδικό κατάστασης 500, που υποδεικνύει ένα εσωτερικό σφάλμα διακομιστή. Σε αυτές τις παρουσίες, θα μπορούσατε να περιμένετε μερικά δευτερόλεπτα και να προσπαθήσετε ξανά, πιθανώς μερικές φορές πριν τα παρατήσετε.

ManualStatusHandling

Εάν Web.Contents λάβει μια απόκριση κωδικού κατάστασης 500, εμφανίζει μια DataSource.Error από προεπιλογή. Μπορείτε να παρακάμψετε αυτή τη συμπεριφορά παρέχοντας μια λίστα κωδικών ως προαιρετικό όρισμα στο Web.Contents:

response = Web.Contents(url, [ManualStatusHandling={404, 500}])

Καθορίζοντας τους κωδικούς κατάστασης με αυτόν τον τρόπο, το Power Query θα συνεχίσει να επεξεργάζεται την απόκριση Web κανονικά. Ωστόσο, η κανονική επεξεργασία απόκρισης συχνά δεν είναι κατάλληλη σε αυτές τις περιπτώσεις. Θα πρέπει να κατανοήσετε ότι έχει ληφθεί ένας μη φυσιολογικός κωδικός απόκρισης και να εκτελέσετε ειδική λογική για τον χειρισμό του. Για να προσδιορίσετε τον κωδικό απόκρισης που επιστρέφεται από την υπηρεσία Web, μπορείτε να αποκτήσετε πρόσβαση σε αυτόν από την meta Εγγραφή που συνοδεύει την απόκριση:

responseCode = Value.Metadata(response)[Response.Status]

Ανάλογα με το αν responseCode είναι 200 ή 500, μπορείτε είτε να επεξεργαστείτε το αποτέλεσμα κανονικά, είτε να ακολουθήσετε τη λογική σας επανάληψης αναμονής που θα ολοκληρώσετε στην επόμενη ενότητα.

IsRetry

Το Power Query διαθέτει ένα τοπικό cache που αποθηκεύει τα αποτελέσματα προηγούμενων κλήσεων στο Web.Contents. Όταν ανιχνεύετε την ίδια διεύθυνση URL για μια νέα απόκριση ή όταν προσπαθήσετε ξανά μετά από μια κατάσταση σφάλματος, θα χρειαστεί να εξασφαλίσετε ότι το ερώτημα αγνοεί τυχόν προσωρινά αποθηκευμένα αποτελέσματα. Μπορείτε να το κάνετε αυτό, συμπεριλαμβάνοντας την IsRetry επιλογή στην κλήση της συνάρτησης Web.Contents . Σε αυτό το δείγμα, θα οριστεί IsRetry σε true μετά την πρώτη επανάληψη του Value.WaitFor βρόχου.

Value.WaitFor

Value.WaitFor() Το είναι μια τυπική συνάρτηση βοηθητικής εφαρμογής που μπορεί συνήθως να χρησιμοποιηθεί χωρίς τροποποίηση. Λειτουργεί δημιουργώντας μια Λίστα προσπαθειών επανάληψης.

producer Επιχείρημα

Περιέχει την εργασία που θα (πιθανώς) επαναληφθεί. Αντιπροσωπεύεται ως συνάρτηση, έτσι ώστε ο αριθμός επανάληψης να μπορεί να χρησιμοποιηθεί στη producer λογική. Η αναμενόμενη συμπεριφορά είναι ότι producer θα επιστρέψει null εάν μια επανάληψη κριθεί απαραίτητη. Εάν επιστρέφεται producerκάτι διαφορετικό από null το , αυτή η τιμή επιστρέφεται με τη σειρά από Value.WaitForτο .

delay Επιχείρημα

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

count Όρισμα (προαιρετικό)

Ένας μέγιστος αριθμός επαναλήψεων μπορεί να οριστεί, παρέχοντας έναν αριθμό στο count όρισμα.

Συνδυάστε τα όλα

Το παρακάτω παράδειγμα δείχνει πώς ManualStatusHandling και Value.WaitFor μπορεί να χρησιμοποιηθεί για την υλοποίηση μιας καθυστερημένης επανάληψης σε περίπτωση απόκρισης 500. Ο χρόνος αναμονής μεταξύ των επαναλήψεων διπλασιάζεται με κάθε δοκιμή, με μέγιστο αριθμό πέντε επαναλήψεων.

let
    waitForResult = Value.WaitFor(
        (iteration) =>
            let
                result = Web.Contents(url, [ManualStatusHandling = {500}, IsRetry = iteration > 0]),
                status = Value.Metadata(result)[Response.Status],
                actualResult = if status = 500 then null else result
            in
                actualResult,
        (iteration) => #duration(0, 0, 0, Number.Power(2, iteration)),
        5)
in
    if waitForResult = null then
        error "Value.WaitFor() Failed after multiple retry attempts"
    else
        waitForResult