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让代码少写了很多嵌套,很方便的逻辑处理,纵享丝滑。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对黑区网络的支持。