async用来标识一个函数式异步函数,是将期约(promise)应用于js函数的结果,异步函数可以暂停执行而不阻塞主线程。异步函数返回一个promise对象(如果是使用return返回了值会被promise.reslove()包装成一个promise对象,没return返回undefined)。调用时该函数不会阻塞主流程。
async函数中,await关键字可以暂停异步代码的执行,等待期约解决,即await右侧的表达式执行完成,执行的时候会让出JS运行时的执行线程,阻塞async函数内的后续的代码,等同步任务执行完毕才会执行。
javascript运行时在遇到await关键字时,会记录在哪里暂停, 等await后的值可用了,js 运行时会向消息队列中推送一个任务(即使右侧是个常量值) ,这个任务会恢复异步函数的执行。
注意事项:
1、await必须在异步函数中async中使用
2、await后的promise对象的运行结果可能是rejected,此时不会执行await后的代码,所以需要把await放在try/catch中捕获异常
3、多个await如果不存在继发关系,最好同时触发(promise.all),减少耗时
同步与异步的区别:
同步函数:函数被调用后不会立即返回,需要该函数的事情全部完成后才会返回并执行后续操作
异步函数:函数被调用后会立即返回,返回后调用者可以继续执行其他行为,同时会启用异步线程执行异步函数内容
回调函数:回调函数就是在调用某个函数时,将自己的一个函数的地址(回调函数代码块地址)作为参数传给那个函数,而那个函数在需要的时候利用参数中的回调地址调用回调函数。
try/catch与promise.catch()的差异:
try/catch用于捕获同步任务产生的异常
promise.catch()用于捕获异步任务产生的异常
async声明的异步函数中,针对await声明的同步代码块可以用try/catch捕获异常