async/await

async函数

申明函数时在function前面加上关键字async,如下

async function test1(){
	return 1;
}
test1().then((res)=>{
	console.log(res);//打印1
});

async function test2(){
	return new Promise((resolve)=>{
		resolve(1)
	});
}
test2().then((res)=>{
	console.log(res);//打印1
});

总结:async函数总是返回一个promise对象,如果函数有return,但是返回的不是promise对象,没关系,JavaScript会把这个返回值包装成promise的resolved方法的参数。

await函数

await关键字只能在async函数内使用

async function test() {
	let promise = new Promise((resolve, reject) => {
		setTimeout(() => resolve('done!'), 2000)
	})
	let result = await promise
	console.log(result)
}
console.log(1);
test();
console.log(1);

---------------------------------------------------
控制台打印:
1
1
done!
---------------------------------------------------

总结:await修饰一个promise对象,表示程序执行到这里需要先等这个promise执行完成,才能继续。

异常处理

如果promise正常resolve,那么await会返回resolve的值,如果promise走了reject的逻辑,就会抛出一个错误。

async function test() {
	let promise = new Promise((resolve, reject) => {
		setTimeout(() => reject('done!'), 2000)
	})
	let result = await promise
	console.log(result)
}
test()
----------------------------
控制台打印:
Uncaught (in promise) done!
----------------------------

所以有必要try catch一下

async function test() {
	let promise = new Promise((resolve, reject) => {
		setTimeout(() => reject('done!'), 2000)
	})
	try{
		let result = await promise
		console.log(result)
	}catch(e){
		console.log("error",e)
	}

}
test()
----------------------------
控制台打印:
error done!
----------------------------

//或者在外面调用async函数的时候catch也行
async function test() {
	let promise = new Promise((resolve, reject) => {
		setTimeout(() => reject('done!'), 2000)
	})
	let result = await promise
	console.log(result)
}
test().catch((error)=>{
	console.log("error",error)
})
----------------------------
控制台打印:
error done!
----------------------------
实战篇
//1.用Promise.all并行处理多个异步操作
async function test(){
	let res = await Promise.all([
		fetch("1"),
		fetch("2"),
		fetch("3")
	]);
	console.log(res);
}
test();
function fetch(data){
	return new Promise((resolve)=>{
		setTimeout(()=>{
			resolve(data)
		},2000);
	});
}
----------------------------
控制台打印:
(3) ["1", "2", "3"]
----------------------------
//注意:如果调用fetch的时候promise对象走了reject的逻辑,则整个Promise.all都会垮掉,直接抛出异常
//2.需要循环处理一个数组里的数据,且必须等前一个元素处理完了,才能接着处理第二个元素
async function circle() {
  let arr = [{}, {}, {}];

  for (let item of arr) {
    await promiseFuc(item)
  }
}

转载于:https://my.oschina.net/u/2425353/blog/3081339

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值