es6的async和await

阅读数:87 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、async

将不是Promise对象的返回值封装,如果有返回值返回为resolved的Promise,如果没有返回值,则返回rejected的Promise。

1、异步函数的返回值

(1)如果是普通值或对象,返回值被包裹在Promise.resove中

{
	console.log("--------3.1 返回一个普通的值或者对象----------");
	async function foo() {
		console.log("foo function start~");
		console.log("内部代码执行");
		console.log("foo function end~");
		return "okok";
	}
	const promiseResult = foo();
	promiseResult.then(res => console.log("result:" + res)); //result:okok 
}

// 如果不写返回值
{
	console.log("--------3.1 不写返回值----------");
	async function foo() {
		console.log("foo function start~");
		console.log("内部代码执行");
		console.log("foo function end~");
	}
	const promiseResult = foo();
	promiseResult.then(res => console.log("result:" + res)); //result:undefined 
}

(2)返回值是Promise,则状态由Promise内部的是resolve还是reject来决定

{
	console.log("-------- 3.2 返回一个Promise----------");
	async function foo() {
		console.log("foo function start~");
		console.log("内部代码执行");
		console.log("foo function end~");
		return new Promise((resolve, reject) => {
			reject("error了");
		});
	}
	const promiseResult = foo();
	promiseResult.catch(err => console.log("result:" + err)); //result:error了 
}

2、异步函数中抛出异常

如果我们在异步函数中抛出异常,它会作为Promise的reject来传递

{
    console.log("------4. 异步函数中抛出异常--------");
	async function foo() {
		console.log("foo function start~");
		console.log("中间代码~");
		// 异步函数中的异常, 会被作为异步函数返回的Promise的reject值的
		throw new Error("error message");
		console.log("foo function end~");
	}
	// 异步函数的返回值一定是一个Promise
	foo().catch(err => console.log("result", err));
	console.log("后续业务~~~~~");
 
	// 运行结果:【foo function end~】没有输出,但是【后续业务~~~~~】输出了
	/*     
      foo function start~
      中间代码~
      后续业务~~~~~
      result Error: error message */
}

二、await

阻塞等待一个返回值,利用await结合Promise对象,可以将异步的操作转换为同步操作。

		function getB() {
			return new Promise((resolve, reject) => {
				setTimeout(() => {
					resolve(2)
				}, 2000)
			})
		}

		function getC() {
			return new Promise((resolve, reject) => {
				setTimeout(() => {
					resolve(3)
				}, 3000)
			})
		}
		async function steps() {
			const a = 1;
			const b = await getB();
			const c = await getC();
			console.log('a :>> ', a);
			console.log('b :>> ', b);
			console.log('c :>> ', c);
		}

三、async和await结合使用

使用async结合await来解决实际应用中嵌套then链的问题,见下例:

	function takeLongTime(n) {
			return new Promise(resolve => {
				setTimeout(() => resolve(n + 200), n);
			});
		}

		function step1(n) {
			console.log(`step1 with ${n}`);
			return takeLongTime(n);
		}

		function step2(n) {
			console.log(`step2 with ${n}`);
			return takeLongTime(n);
		}

		function step3(n) {
			console.log(`step3 with ${n}`);
			return takeLongTime(n);
		}


		function work() {
			console.time('work')
			const time1 = 300;
			step1(time1)
				.then(time2 => {
					return step2(time2)
				})
				.then(time3 => {
					return step3(time3)
				})
				.then(result => {
					console.log(`你最终挣了${result}`);
					console.timeEnd("work");
				})
		}
		work()

使用await可以更加优雅的处理这个过程

	function takeLongTime(n) {
			return new Promise(resolve => {
				setTimeout(() => resolve(n + 200), n);
			});
		}
		function step1(n) {
			console.log(`step1 with ${n}`);
			return takeLongTime(n);
		}
		function step2(n) {
			console.log(`step2 with ${n}`);
			return takeLongTime(n);
		}
		function step3(n) {
			console.log(`step3 with ${n}`);
			return takeLongTime(n);
		}
		async function work() {
			console.time('work')
			const time1 = await step1(300)
			const time2 = await step2(time1)
			const time3 = await step3(time2)
			console.log(`你最终挣了${time3}`);
			console.timeEnd("work");
		}
		work()



相关推荐

一、script标签属性 async 表示立即下载该脚本,但不妨碍页面中的其他操作,只对外部文件有效。 charset 与src属性一起使用,告诉浏览器用来编码这个javascript程序的

一、概述 在Vue中,修饰符处理了许多dom事件的细节,让我们不再需要花大量的时间去处理这些烦恼的事情,而能有更多精力专注于程序的逻辑处理。 1、修饰符分类 (1)表单修饰符 (2)事件修饰符 (3)