JavaScriptPromises,让我们摆脱回调地狱,真的很神奇。Promises允许我们更好地引入和处理异步任务。即便如此,引入很多then还是会让代码变得凌乱。我已经开始使用ES2017中的async和await关键字来简化处理承诺。让我们来看看async和await!快速启动async是函数声明中的关键字await。它用于处理承诺。await必须在async声明的函数内部使用。虽然Chrome已经支持返回promises对象的“顶级”awaitasync函数,但它并不关心函数的返回值是什么。asyncawait和promises的底层实现是一样的大多数浏览器和Nodejs都已经可用async和await的好处代码更清晰简洁回调更少,更容易调试接下来,减少缩进。async和await介绍从一个例子开始会更容易。先来看一个简单的async/await用法://使用async定义一个函数,然后await可以使用asyncfunctionfetchContent(){//不用fetch().then,使用awaitletcontent=awaitfetch('/');让text=awaitcontent.text();//在异步函数内部,text是响应值console.log(text);//用文本returntext解析这个异步函数;}//使用异步函数varpromise=fetchContent().then(...);首先使用异步声明函数;声明后,可以在函数内部使用await。await关键字后跟一个promise:fetchAPI。异步任务(本例中为fetch)执行完后,继续执行下一个任务,直到执行完毕(不阻塞)。最后这个函数处理返回值并返回一个promises对象。代码自上而下,告别回调,异步处理变得更简单!将Promise转换为await如果时间允许,您一定急于将您的promise代码升级为await,让我们看看如何操作://Before:callbackcity!fetch('/users.json').then(response=>response.json()).then(json=>{console.log(json);}).catch(e=>{console.log('error!');})//After:nomorecallbacks!asyncfunctiongetJson(){try{letresponse=awaitfetch('/users.json');让json=awaitresponse.json();控制台日志(json);}catch(e){console.log('错误!',e);从使用multiplethen到await非常简单,但您的代码变得非常易于维护。async/await模式通过以下方式声明异步函数:anonymousAsyncfunctionletmain=(asyncfunction(){letvalue=awaitfetch('/');})();异步函数声明asyncfunctionmain(){letvalue=awaitfetch('/');};异步函数赋值letmain=asyncfunction(){letvalue=awaitfetch('/');};//箭头函数太!letmain=async()=>{letvalue=awaitfetch('/');};作为参数的异步函数document.body.addEventListener('click',asyncfunction(){letvalue=awaitfetch('/');});对象和类方法//对象propertyletobj={asyncmethod(){letvalue=awaitfetch('/');}};//类方法类MyClass{asyncmyMethod(){letvalue=awaitfetch('/');}}如您所见,添加异步函数非常简单,并且非常适合各种函数创建流程。错误处理传统的承诺允许使用catch回调来处理拒绝。当你使用await时,最好使用try/catch:,有用!ParallelGoogle的JakeArchibald在异步函数文档中提出了一个完美的观点:不要使用await使任务过于序列化。也就是说,对于可以同时执行的任务,先触发任务再使用await,而不是直接使用await,让任务存储像栈一样。//总共需要1000毫秒!asyncfunctionseries(){awaitwait(500);等待等待(500);return"done!";}//总共只需要500毫秒!asyncfunctionparallel(){constwait1=wait(500);constwait2=wait(500);等待等待1;等待等待2;return"done!";}第一个代码块的反面例子,第二个await需要等待第一个await的执行才能执行,第一个await两个代码块是同时触发两个任务比较好的方式时间,然后使用await;这样做可以让多个异步操作同时执行!Promise.all等效PromiseAPI中我最喜欢的API之一是Promise.all:当多个任务完成时会触发回调。async/await中没有等价的操作,但是这篇文章提供了一个很好的解决方案:let[foo,bar]=awaitPromise.all([getFoo(),getBar()]);请记住,async/await和promises在底层实现上是一致的,所以我们可以简单地等待(await)所有的promise结束!现在大部分浏览器都可以使用async和await,Nodejs也可以,老版本的Nodejs可以使用transform-async-to-generator是一个babel插件来使用async和await。Promise仍然很棒,但是async和await让它更易于维护。原文地址:https://davidwalsh.name/async...博客原文地址:http://zhaojizong.online/post...
