searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

async/await-能保持错误调用栈的异步处理方案

2023-10-25 07:10:34
34
0

async/await作为generator的语法糖,用于解决promise的链式调用问题被熟知,aync/await能使同步的方式来写异步代码,从而提高代码的可读性和简洁性,但除此之外,aync/await还有很重要也是经常被忽略的一点-它能够保持异步中的错误调用栈,提升开发者定位错误问题的效率

 

异步中的错误调用栈丢失问题

function promiseTest(){
   new Promise(
      (res, rej) => res(2)
  ).then((a)=>{ throw new Error(1)})
}
promiseTest()

执行如上代码,结果如下图:

可以看到,异步执行过程中的异常抛出后,丢失了外层函数的调用栈

实际上,使用回调函数或者Promise这类异步处理方式会在代码执行过程中创建新的执行上下文,导致原始的错误调用栈信息丢失。

具体来说,当异步操作发生时,JavaScript会将回调函数或Promise链中的代码放入事件队列中等待执行。当异步操作完成后,事件循环会从事件队列中取出相应的代码并执行。在这个过程中,会创建一个新的执行上下文,而原始的调用栈信息不会被保留,导致错误调用栈丢失。

保持异步中的错误调用栈-anync/await

async function asyncTest(){
  await new Promise((res,rej)=>{res(1)}).then(() => {throw new Error(2)})
}

如上图,async异步处理中抛出了异常,但是外层的调用函数被输出在了异常调用栈中并没有丢失

 

事实上,Async/Await是generator函数的语法糖,它能够保持错误调用栈的原因也在于此,因为使用了生成器函数的特性。

Async/Await在遇到await关键字时,会将函数暂停执行并返回一个Promise对象,等待异步操作完成后再继续执行。如果异步操作发生错误,该错误会被抛回到调用该函数的地方,同时保持错误的调用栈信息。

同时Async/Await机制在内部使用了try-catch语句来捕获错误,并将错误对象与原始的调用栈信息一起抛出,从而保留了错误的上下文信息,使得开发者能够更方便地进行调试和定位错误。因此,Async/Await相较于Promise能够更好地保持错误调用栈信息,提高调试效率。

 

0条评论
0 / 1000
s****m
1文章数
0粉丝数
s****m
1 文章 | 0 粉丝
s****m
1文章数
0粉丝数
s****m
1 文章 | 0 粉丝
原创

async/await-能保持错误调用栈的异步处理方案

2023-10-25 07:10:34
34
0

async/await作为generator的语法糖,用于解决promise的链式调用问题被熟知,aync/await能使同步的方式来写异步代码,从而提高代码的可读性和简洁性,但除此之外,aync/await还有很重要也是经常被忽略的一点-它能够保持异步中的错误调用栈,提升开发者定位错误问题的效率

 

异步中的错误调用栈丢失问题

function promiseTest(){
   new Promise(
      (res, rej) => res(2)
  ).then((a)=>{ throw new Error(1)})
}
promiseTest()

执行如上代码,结果如下图:

可以看到,异步执行过程中的异常抛出后,丢失了外层函数的调用栈

实际上,使用回调函数或者Promise这类异步处理方式会在代码执行过程中创建新的执行上下文,导致原始的错误调用栈信息丢失。

具体来说,当异步操作发生时,JavaScript会将回调函数或Promise链中的代码放入事件队列中等待执行。当异步操作完成后,事件循环会从事件队列中取出相应的代码并执行。在这个过程中,会创建一个新的执行上下文,而原始的调用栈信息不会被保留,导致错误调用栈丢失。

保持异步中的错误调用栈-anync/await

async function asyncTest(){
  await new Promise((res,rej)=>{res(1)}).then(() => {throw new Error(2)})
}

如上图,async异步处理中抛出了异常,但是外层的调用函数被输出在了异常调用栈中并没有丢失

 

事实上,Async/Await是generator函数的语法糖,它能够保持错误调用栈的原因也在于此,因为使用了生成器函数的特性。

Async/Await在遇到await关键字时,会将函数暂停执行并返回一个Promise对象,等待异步操作完成后再继续执行。如果异步操作发生错误,该错误会被抛回到调用该函数的地方,同时保持错误的调用栈信息。

同时Async/Await机制在内部使用了try-catch语句来捕获错误,并将错误对象与原始的调用栈信息一起抛出,从而保留了错误的上下文信息,使得开发者能够更方便地进行调试和定位错误。因此,Async/Await相较于Promise能够更好地保持错误调用栈信息,提高调试效率。

 

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0