一對一影片原始碼,非同步中出現了異常該如何處理?

云豹科技-苏凌霄發表於2024-05-25

一對一影片原始碼,非同步中出現了異常該如何處理?
js本質上是同步的,是一種單執行緒語言。諸如瀏覽器引擎之類的宿主環境使用許多Web API,增強了 js以與外部系統進行互動並處理與 I/O 繫結的操作。瀏覽器中非同步操作有:定時器相關的函式、事件、Ajax請求和 Promise等。

一、定時器的錯誤處理

function failAfterOneSecond() {
    setTimeout(() => {
        throw Error("發生錯誤");
    }, 1000);
}
try {
    failAfterOneSecond();
} catch (error) {
    console.error("捕獲到的錯誤:", error.message);
}
// Error: 發生錯誤
//     at Timeout._onTimeout (D:\iflyItem\demo.js:3:15)
//     ...stack

可以看出來try/catch沒有捕獲到異常,這是因為try/catch是同步,而setTimeout是非同步的。當執行到setTimeout回撥時,函式呼叫棧早就沒有try/catch的蹤影了,所以異常就無法捕獲到。

二、使用Promise處理異常

// Promise處理定時器的異常
function failAfterOneSecond() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(Error('發生錯誤'));
        }, 1000);
    });
}
failAfterOneSecond().catch(
    error => console.log('捕獲到的錯誤:', error.message) // 捕獲到的錯誤: 發生錯誤
);
​
const promiseSuccess1 = Promise.resolve('resPromiseSuccess1');
const promiseSuccess2 = Promise.resolve('resPromiseSuccess2');
const promiseFaied1 = Promise.reject(Error('resPromiseFaied1'));
const promiseFaied2 = Promise.reject(Error('resPromiseFaied2'));
​
// Promise.all處理錯誤
Promise.all([promiseSuccess1, promiseSuccess2]).then(res => console.log(res));
// [ 'resPromiseSuccess1', 'resPromiseSuccess2' ]
// Promise.any處理錯誤
Promise.any([promiseFaied1, promiseFaied2]).catch(error => console.log(error));
// AggregateError: All promises were rejected
// error.errors:['resPromiseFaied1', 'resPromiseFaied2']
// Promise.race處理錯誤
Promise.race([promiseSuccess2, promiseSuccess1, promiseFaied2])
    .then(res => console.log(res))
    .catch(error => console.log(error));
// resPromiseSuccess2
// Promise.allSettled處理錯誤
Promise.allSettled([promiseSuccess1, promiseSuccess2, promiseFaied1, promiseFaied2])
    .then(res => console.log(res))
    .catch(error => console.log(error));
// [
//     { status: 'fulfilled', value: 'resPromiseSuccess1' },
//     { status: 'fulfilled', value: 'resPromiseSuccess2' },
//     { status: 'rejected', reason: 'resPromiseFaied1' },
//     { status: 'rejected', reason: 'resPromiseFaied2' }
// ];

以上就是一對一影片原始碼,非同步中出現了異常該如何處理?, 更多內容歡迎關注之後的文章

相關文章