es6学习之async和await关键字

await关键字

await关键字只能在async函数中使用,如果再没有async的函数中使用就会报错。

  1. await关键字会暂停当前async函数的执行,等待promise处置完成。
  2. 如果promise正常处理则会返回promise中的resolve的值。
  3. 如果处理失败会把promise的异常原因抛出。
  4. 如果await操作符的表达
  5. +式不是一个promise.则返回该值的本身。
async function demo1() {
				let reslut = await Promise.resolve('处理成功!')
				return reslut;
			}

			async function demo2() {
				try {
					let reslut = await Promise.reject('处理失败!')
					return reslut;
				} catch (e) {
					console.log("e:" + e);
					return e;
				}
			}
			async function demo3() {
				let reslut = await "返回正常值";
				return reslut;
			}
			demo1().then((val) => {
				console.log("demo1" + val)
			});
			demo2().then((val) => {
				console.log("demo2" + val)
			});
			demo3().then((val) => {
				console.log("demo3" + val)
			});
			// 打印出:
			// e:处理失败!
			// demo1处理成功!
			// demo2处理失败!
			// demo3返回正常值

async 函数

async 函数是使用async关键字声明的函数,并且其中允许使用await关键字。asyncawait关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。说白了就是promise的另一种使用形式。

  1. async 函数一定会返回一个 promise 对象。如果一个 async 函数的返回值看起来不是 promise,那么它将会被隐式地包装在一个 promise 中。
    async function demo(){
    				return 1;
    			}
    			async function demo1(){
    				return Promise.resolve(1);
    			}
    			demo().then((val)=>{
    				console.log('demo:'+val)
    			})
    			demo1().then((val)=>{
    				console.log('demo1:'+val)
    			})
    			// demo和demo1函数返回的数值一样
  2. 在async函数中可能会包含0到多个的await 表达式。以下打印的顺序是过两秒之后打印1再过两秒之后打印2之后是‘33333’。
async function foo() {
				const result1 = await new Promise((resolve) => setTimeout(() => resolve('1'), 2000))
				console.log(result1)
				const result2 = await new Promise((resolve) => setTimeout(() => resolve('2'), 2000))
				console.log(result2)
				console.log("33333")
			}
			foo()

使用 async 函数重写 promise 链

	function demo1() {
				let r1 = new Promise((resolve) => {
						resolve(1)
					}).then((val) => {
						console.log('val1:' + val)
						return Promise.resolve(val + 1)
					}).then((val) => {
						console.log('val2:' + val)
						return Promise.resolve(val + 1)
					})
					.catch((e) => {
						console.log(e)
					})
			}

			async function demo2() {
				try {
					let val=1;
					let val1=await Promise.resolve(val);
						console.log('val1:' + val1)
					let val2=await Promise.resolve(val1+1);
						console.log('val2:' + va2)

				} catch (e) {
					console.log(e)
				}
			}
			demo1()
			demo2()

以上demo1和的demo2函数的执行过程是一样的。

async/await 和Promise#then 对比以及错误处理: 警告:

大多数 async 函数也可以使用 Promises 编写。但是,在错误处理方面,async 函数更容易捕获异常错误

上面例子中的 demo1函数和demo2函数在功能上都是等效的。在demo2函数中,如果任一awaited 调用失败,它将自动捕获异常,async 函数执行中断,并通过隐式返回 Promise 将错误传递给调用者。

在 Promise 例子中这种情况同样会发生,该函数必须负责返回一个捕获函数完成的Promise。在demo1函数中,这意味着它从Promise.all([]).then()返回一个 Promise。

 

posted @ 2022-06-26 21:55  七分暖  阅读(182)  评论(0编辑  收藏  举报
回到顶部