一对一视频源码,异步中出现了异常该如何处理?
一对一视频源码,异步中出现了异常该如何处理?
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处理定时器的异常 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' } // ];
以上就是一对一视频源码,异步中出现了异常该如何处理?, 更多内容欢迎关注之后的文章