อ่านในภาษาอังกฤษ

แชร์ผ่าน


รูปแบบการรอใหม่

ในบางสถานการณ์ ลักษณะการทํางานของแหล่งข้อมูลไม่ตรงกับที่คาดหมายโดยการจัดการรหัส HTTP เริ่มต้นของ Power Query ตัวอย่างด้านล่างแสดงวิธีการแก้ไขสถานการณ์นี้

ในสถานการณ์นี้ คุณจะทํางานกับ REST API ซึ่งบางครั้งจะส่งกลับรหัสสถานะ 500 ซึ่งระบุถึงข้อผิดพลาดของเซิร์ฟเวอร์ภายใน ในกรณีเหล่านี้ คุณสามารถรอสักครู่ แล้วลองใหม่อีกครั้ง ซึ่งอาจเกิดขึ้นสักสองสามครั้งก่อนที่คุณจะยอมแพ้

ManualStatusHandling

ถ้า Web.Contents ได้รับการตอบกลับรหัสสถานะ 500 รายการ ระบบจะโยนไป DataSource.Error ตามค่าเริ่มต้น คุณสามารถแทนลักษณะการทํางานนี้ได้โดยการให้รายการโค้ดเป็นอาร์กิวเมนต์ทางเลือกเป็น Web.Contents:

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

ด้วยการระบุรหัสสถานะด้วยวิธีนี้ Power Query จะยังคงประมวลผลการตอบสนองของเว็บตามปกติ อย่างไรก็ตาม การประมวลผลการตอบสนองปกติมักไม่เหมาะสมในกรณีเหล่านี้ คุณจะต้องเข้าใจว่าได้รับรหัสการตอบสนองที่ผิดปกติและดําเนินการตรรกะพิเศษเพื่อจัดการรหัสดังกล่าว หากต้องการกําหนดรหัสการตอบสนองที่ถูกส่งกลับจากบริการเว็บ คุณสามารถเข้าถึงได้จาก meta บันทึกที่มาพร้อมกับการตอบสนอง:

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

ขึ้นอยู่กับว่า responseCode คือ 200 หรือ 500 คุณสามารถประมวลผลผลลัพธ์เป็นปกติ หรือทําตามตรรกะการรอลองใหม่ของคุณที่คุณจะสร้างในส่วนถัดไป

IsRetry

Power Query มีแคชภายในเครื่องที่จัดเก็บผลลัพธ์ของการเรียกไปยัง Web.Contents ก่อนหน้านี้ เมื่อทําการโพลล์ URL เดียวกันสําหรับการตอบกลับใหม่หรือเมื่อลองใหม่หลังจากสถานะข้อผิดพลาด คุณจะต้องตรวจสอบให้แน่ใจว่าคิวรีนั้นละเว้นผลลัพธ์ที่แคชไว้ คุณสามารถทําได้โดยการรวมIsRetryตัวเลือก ในการเรียกฟังก์ชันWeb.Contents ในตัวอย่างนี้ เราจะตั้งค่า IsRetry เป็น true หลังจากการเกิดซ้ําครั้งแรกของ Value.WaitFor รอบ

Value.WaitFor

Value.WaitFor()เป็นฟังก์ชันผู้ช่วยเหลือมาตรฐานที่โดยปกติแล้วจะสามารถใช้ได้โดยไม่มีการปรับเปลี่ยน ซึ่งทํางานโดยการสร้างรายการของความพยายามอีกครั้ง

producer อาร์กิวเมนต์

ซึ่งประกอบด้วยงานที่จะลองใหม่ (อาจเป็น) ซึ่งแสดงเป็นฟังก์ชัน เพื่อให้สามารถใช้หมายเลขการเกิดซ้ําใน producer ตรรกะได้ ลักษณะการทํางานที่คาดไว้คือการ producer ส่งกลับ null ถ้ามีการกําหนดลองใหม่ให้จําเป็น ถ้าค่าอื่นนอกเหนือจาก null ถูกส่งกลับโดย producerค่าดังกล่าวจะกลับเป็นค่าที่ส่งกลับโดย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