ES7中利用Await减少回调嵌套的方法详解(3)
babel的await实现是转成了ES6的generator,如下关键代码:
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
// sleep返回一个Promise对象
return sleep(1000);
case 2:
case "end":
return _context.stop();
}
}
而babel的generator也是要用ES5实现的,什么是generator呢?如下图所示:

生成器用function*定义,每次执行生成器的next函数的时候会返回当前生成器里用yield返回的值,然后生成器的迭代器往后走一步,直到所有yield完了。
有兴趣的可以继续研究babel是如何把ES7转成ES5的,据说原生的实现还是直接基于Promise.
使用await还有一个好处,可以直接try-catch捕获异步过程抛出的异常,因为我们是不能直接捕获异步回调里面的异常的,如下代码:
let quoteHandler = {
confirmCreate: function(){
$(form.submit).on("click", function(event){
// 这里会抛undefined异常:访问了undefined的value属性
callback(form.notFoundInput.value);
});
}
}
try {
// 这里无法捕获到异常
quoteHandler.confirmCreate();
} catch (e) {
}
上面的try-catch是没有办法捕获到异常的,因为try里的代码已经执行完了,在它执行的过程中并没有异常,因此无法在这里捕获,如果使用Promise的话一般是使用Promise链的catch:
let quoteHandler = {
confirmCreate: function(){
return new Promise(resolve => {
$(form.submit).on("click", function(event){
// 这里会抛undefined异常:访问了undefined的value属性
resolve(form.notFoundInput.value);
});
});
}
}
quoteHandler.confirmCreate().then(createType => {
}).catch(e => {
// 这里能捕获异常
});
而使用await,我们可以直接用同步的catch,就好像它真的变成同步执行了:
try {
createType = await quoteHandler.confirmCreate("order");
}catch(e){
console.log(e);
return;
}
总之使用await让代码少写了很多嵌套,很方便的逻辑处理,纵享丝滑。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对黑区网络的支持。
