ค้นหาเว็บไซต์

javascript - การจัดการข้อผิดพลาดในเมธอด Angular HttpClient แบบ async/await


ฉันกำลังพยายามใช้รูปแบบ async/await เพื่อจัดการกับสถานการณ์ที่อาจถูกพิจารณาว่าเป็น "callback hell" หากนำไปใช้อย่างอื่น

นี่คือเวอร์ชันที่ทำให้ง่ายสุด ๆ ของโค้ด โค้ดจริงมีการเรียก HttpClient แบบมีเงื่อนไขประมาณ 5 ครั้งขึ้นอยู่กับข้อมูลจากการเรียกครั้งแรก (ไม่ใช่ API ของฉัน...) ซึ่งนี่คือเหตุผลที่ฉันใช้รูปแบบ async/await ตั้งแต่แรก

async blah(): Promise<boolean> {
    try {
        let resp = await this.http.get("https://httpstat.us/500").toPromise();
        console.warn("you should not see this");

        // the real code will logically call the api multiple times based on conditonal data from resp
        // hence the attempted usage of async/await to avoid "callback hell"
        // blah() will eventually return an object.

        return true;
    }
    catch (err) {
        console.error("caught inside blah()");
        throw err;
    }
}

ionViewDidLoad() {
    this.blah().then(data => {
        console.warn('okokokok');
    }).catch(error => {
        console.error(error)
    });
}

เกิดอะไรขึ้น ฉันสามารถเห็นว่าการเรียกจริง ๆ เป็น 500 แต่โค้ดยังคงทำงานต่อและสิ่งต่อไปนี้ถูกพิมพ์ออกบนคอนโซล:

polyfills.js:3 GET https://httpstat.us/500/ 500 (Internal Server Error)
main.js:927 you should not see this
main.js:940 okokokok

อย่างที่คุณเห็น มันไม่ได้จับ 500 (หรือสถานะ HTTP อื่น ๆ ที่ฉันทดสอบแล้ว)

อุปกรณ์ที่ฉันทดสอบด้วยคือ Pixel 2 ที่ใช้งาน P และข้อมูลจากคอนโซลมาจากเซสชันตัวตรวจสอบอุปกรณ์ของ Chrome

คำแนะนำใด ๆ จะได้รับการชื่นชมอย่างมาก

** แก้ไข: นี่ชัดเจนว่าเป็นปัญหาจากการรวมกันของ Ionic และ Angular... มันควรจะทำงานได้...

** แก้ไข: ปรากฏว่ามีสาเหตุจาก Angular 100% ... ไม่ใช่ตัว framework เอง แต่เป็นวิธีที่มีการใช้งาน interceptor ฉันจะปล่อยสิ่งนี้ไว้ที่นี่แทนการลบคำถามในกรณีที่มีคนอื่นต้องการมัน

คำตอบ #1

ถ้าผมเข้าใจคำถามของคุณถูกต้อง คุณต้องการทำการเรียกแบบลำดับชั้น ดังนั้นคุณจึงทำการเรียก HTTP และตามผลลัพธ์ที่ได้คุณต้องการทำการเรียก HTTP อีกครั้ง ถ้าเป็นกรณีนั้น คุณควรพิจารณาใช้ตัวดำเนินการ switchMap:

this.http.get("https://httpstat.us/500").pipe( switchMap( result => { if(result.a === 5) { return this.http.get("some server api url"); } return return this.http.get("another server api url"); }) )

คุณจัดการข้อผิดพลาดเหล่านั้นในแบบของ rxjs

ดูการเรียกแบบเรียงลำดับ