async/await 中的try/catch
es6中的async是异步编程的终极解决方案,近期学习了一下,相对于 generator 来说,具有更好的特性:内置执行器、更好的语义、更好的适用性,需要注意一点的是 await 后面是promise 对象或者原始类型的值。
更有意思的是可以使用 try/catch 来捕获异步中出现的异常
async/await中的 try/catch
// 定时器
function timer(params) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
// resolve('resolve');
reject('reject');
}, params);
})
}
// async/await
async function fn(params) {
try {
var value = await timer(params);
} catch (error) {
console.log(error);
}
}
fn(1000); //执行
promise的状态变为 rejected 之后会跳转到 catch
内部实现
看了阮一峰老师的博客后,恍然大悟,原来是用 Generator.prototype.throw 和
Generator.prototype.next 来实现自动执行及异常抛出。
// 定时器
function timer(params) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
// resolve('resolve');
reject('reject'); // next.value 为 rejected 状态
}, params);
})
}
// aysnc 声明的函数
function fn(args) {
return spawn(function* () { // 配合 next 按步骤自动执行
try {
yield timer(args); // timer Promise类型
} catch (error) {
console.log(error);
}
});
}
// 自动执行器
function spawn(genF) {
return new Promise(function (resolve, reject) {
var gen = genF();
function step(nextF) {
try {
var next = nextF(); // 执行 gen.next 或者 gen.throw ,使用 try/catch 捕获异常
} catch (e) {
return reject(e);
}
if (next.done) {
return resolve(next.value);
}
Promise.resolve(next.value).then(function (v) {
step(function () {
return gen.next(v);
});
}, function (e) {
step(function () {
return gen.throw(e); // 若 next.value 是 rejected 状态,抛出异常,函数体内的try/catch捕获
});
});
}
step(function () {
return gen.next(undefined);
});
});
}
fn(100).then(function (data) {
console.log(data)
}).catch(function (error) {
console.log(error);
})