async 函数,以同步的防止操作异步代码,使异步操作变得更加方便。
async 函数是 Generator 函数的语法糖。
错误在成功之后,错误和成功都会执行
let fn = async function() { let data = await Promise.resolve('success'); console.log(data) await Promise.reject('fail'); } fn().then(data => console.log(data)).catch(err => console.log(err))但是如果错误在前,成功将不会执行
async function fn(){ await Promise.reject('出错了') let a = await Promise.resolve("成功了"); console.log(a); } fn().then(res => { console.log(res); }).catch(err => { console.log(err); }) // 打印结果 // 出错了如何解决async函数中抛出错误,影响后续代码执行;
这个问题比较严重,虽然是async的特点,但是我又不知道程序什么时候出错,所以我不希望出错的代码影响我后续运行
try{}用来检测里面的代码,如果出现报错,会直接被catch捕获
catch(err){} 参数err就是捕获的错误,这个错误有两个属性,name,message
name: 错误的类型
message: 错误的信息
JS常用的错误类型
ReferenceError 引用错误
TypeError 类型错误
SyntaxError 语法错误
关键词 throw
就是将错误抛到浏览器的控制台中
new 关键字
创建一个新的错误
例子:
async function fn(){ try{ await Promise.reject('出错了') }catch(e){ let a = await Promise.resolve("成功了"); console.log(a); } }本来await后面的就是promise,那么我们就可以直接使用catch处理
async function fn(){ await Promise.reject('出错了').catch(err=>{ console.log(err); }) let a = await Promise.resolve("成功了"); console.log(a); }其实跟网络打交道的都不保险,你不可能给每一个await后面的promise对象都加catch
个人建议,只要有await的地方都try catch掉 然后统一处理结果
try { let f1 = await Promise.resolve('成功了'); let f2 = await Promise.resolve('成功了'); let f3 = await Promise.reject('出错了'); }catch(e){}如果你多次请求的数据之间没有关联,就可以使用Promise.all()
// async async function fn(){ let [f1,f2,f3] = await Promise.all([ Promise.resolve('成功了1'), Promise.resolve('成功了2'), Promise.resolve('成功了3') ]) console.log(f1); console.log(f2); console.log(f3); } fn();同时配合解构处理
例子:
async function show() { let p1 = await new Promise((res, rej) => { $.ajax({ url: 'https://jsonplaceholder.typicode.com/todos/1', success: function(data) { res(data) }, error: function(err) { rej() } }) }); console.log(p1) let p2 = await new Promise((res, rej) => { $.ajax({ url: 'https://jsonplaceholder.typicode.com/todos/2', success: function(data) { res(data) }, error: function(err) { rej() } }) }); console.log(p2) } let pp = show()