Čítať v angličtine

Zdieľať cez


Vzor Čakať – skúsiť znova

V niektorých situáciách sa správanie zdroja údajov nezhoduje so správaním očakávaným v predvolenom spracovaní kódu HTTP doplnku Power Query. Nižšie uvedené príklady ukazujú, ako túto situáciu vyriešiť.

V tomto scenári budete pracovať s rozhraním REST API, ktoré príležitostne vráti kód stavu 500, ktorý označuje internú chybu servera. V týchto prípadoch môžete počkať niekoľko sekúnd a opakovať to, potenciálne niekoľkokrát, kým sa vzdate.

Manuálneštáty

Ak Web.Contents sa zobrazí odpoveď kódu stavu 500, predvolene DataSource.Error sa zobrazí. Toto správanie môžete prepísať zadaním zoznamu kódov ako voliteľného argumentu pre Web.Contents:

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

Zadaním kódov stavu týmto spôsobom bude Power Query naďalej spracovávať webovú odpoveď ako zvyčajne. V týchto prípadoch však normálne spracovanie odpovede nie je často vhodné. Budete musieť pochopiť, že bol prijatý kód abnormálne odpovede a vykonávať špeciálnu logiku na jeho spracovanie. Ak chcete určiť kód odpovede vrátený z webovej služby, môžete k nemu získať prístup zo záznamu meta , ktorý sprevádza odpoveď:

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

Na základe toho, či responseCode je hodnota 200 alebo 500, môžete buď spracovať výsledok ako zvyčajne, alebo postupovať podľa logiky čakania, ktorú zistíte v ďalšej časti.

Funkcia IsRetry

Power Query má lokálnu vyrovnávaciu pamäť, ktorá ukladá výsledky predchádzajúcich volaní do webového.obsahu. Pri vzorkovaní rovnakej URL adresy pre novú odpoveď alebo pri opätovnom pokuse o stav chyby je potrebné zabezpečiť, aby dotaz ignoroval všetky výsledky vo vyrovnávacej pamäti. Môžete to urobiť zahrnutím IsRetry možnosti do Web.Contents volania funkcie . V tejto ukážke nastavíme hodnotu IsRetry true po prvej iterácii Value.WaitFor slučky.

Value.WaitFor

Value.WaitFor() je štandardná pomocná funkcia , ktorú možno zvyčajne použiť bez úpravy. Funguje tak, že vytvára zoznam pokusov opakovania.

producer Argument

Toto obsahuje úlohu, ktorá sa má (možno) zopakovať. Je zastúpená ako funkcia, aby sa iteračné číslo mohlo použiť v logike producer . Očakávané správanie je to, ktoré sa vrátinull, ak sa zistí, že producer je potrebné skúsiť znova. Ak funkcia vráti niečo iné ako null hodnotu producer, táto hodnota sa vráti parametrom Value.WaitFor.

delay Argument

Toto obsahuje logiku, ktorá sa má vykonať medzi pokusmi. Je zastúpená ako funkcia, aby sa iteračné číslo mohlo použiť v logike delay . Očakávané správanie je, že delay vracia trvanie.

count Argument (voliteľné)

Maximálny počet pokusov je možné nastaviť zadaním čísla do argumentu count .

Zhrnutie

V nasledujúcom príklade je uvedené, ako ManualStatusHandling a Value.WaitFor možno použiť na uskutočnenie oneskoreného opakovania v prípade odozvy 500. Čas čakania medzi pokusmi sa zdvojnásobí pri každom pokuse, maximálne päť pokusov.

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