ES6的语法在前端的工作中已经是很常见了,对于promise的应用相信也应该是或多或少有了一些认知,此文主要记录的是关于异常捕获这块的内容

测试的方法

		httpTest(status) {
			return new Promise((resolve, reject) => {
				setTimeout(() => {
					if (status === 'success') {
						resolve({ code: 200, msg: '操作成功' });
					} else {
						reject('error');
					}
				}, 300);
			});
		}

当我们使用.then().catch()的方法调用,我们在catch中就可以捕获到异常

		getList2() {
			this.httpTest()
				.then(res => {
					console.log(res);
				})
				.catch(err => {
					console.log(err);
				});
		},

但是当我们使用es7的 async/await呢?

只是这么写,我们是捕获不到异常的!

		async getList3() {
			let resp = await this.httpTest();
			console.log(resp);
		},

1. 这个时候我们需要一个捕获异常的地方,有些人就想到了链式调用的catch,但是这么写总是有点四不像的样子,我既然想用async/await这种调用方式,那就看上了这种的调用更加的优雅,代码更加的清晰明了,在后面加上一个.catch就显的很怪

		async getList4() {
			let resp = await this.httpTest().catch(err => console.log(err));
			console.log(resp);
		},

2. 使用try / catch来捕获异常,这样的话代码就看起来舒服多了,catch里面的err就是我们所捕获的异常

		async getList6() {
			try {
				let resp = await this.httpTest();
				console.log(resp);
			} catch (err) {
				console.log(err);
			}
		},

但是问题,又来了,我在一个方法里面写了好几个请求方法,这个时候该怎么办?有的人的写法

		async getList6() {
			try {
				let resp1 = await this.httpTest();
				console.log(resp1);
				let resp2 = await this.httpTest();
				console.log(resp2);
				let resp3 = await this.httpTest();
				console.log(resp3);
			} catch (err) {
				console.log(err);
			}
		},

合理吗?显然是不合理!这个err值只输出了一次,我怎么知道这捕获的是谁的?,那怎么办?每个都写一个try / catch,是个解决办法,像下面这样,好看吗,看着还整洁,如果再加上业务代码处理,那就写了好多代码啊。。。作为一个懒人,我们需要想点招

		async getList6() {
			try {
				let resp1 = await this.httpTest();
				console.log(resp1);
			} catch (err) {
				console.log(err);
			}
			try {
				let resp2 = await this.httpTest();
				console.log(resp2);
			} catch (err) {
				console.log(err);
			}
			try {
				let resp3 = await this.httpTest();
				console.log(resp3);
			} catch (err) {
				console.log(err);
			}
		},

3. 一个小招,我们写了一个test的方法,做一个简单的封装

		test(fn) {
			return new Promise(async resovle => {
				try {
					let res = await fn;
					resovle([null, res]);
				} catch (err) {
					resovle([err, null]);
				}
			});
		},

        //或者这样
        async test(fn) {
	        try {
		        let resp = await fn
		        return [null, resp]
	        } catch (err) {
		        return [err, null]
	        }
        }

调用,爽吗我就问!

		async getList5() {
			let [err, res] = await this.test(this.httpTest());
			console.log('res===>', res);
			console.log('err===>', err);
			let [err1, res1] = await this.test(this.httpTest('success'));
			console.log('res1===>', res1);
			console.log('err1===>', err1);
			let [err2, res2] = await this.test(this.httpTest('fail'));
			console.log('res2===>', res2);
			console.log('err2===>', err2);
		},

 如果各位谁还有别的方法,请评论或者私聊教教我,求求了!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐