async await不存在ES6中,存在于ES7的提案中,但是由于浏览器和编译工具的支持,现在用的也比较广泛,而且它也是基于Promise,并没有和Promise冲突,可以算Promise的一个补充。
在Promise的异步解决方案中,我们可以看出callback的形式依然存在,只是可以做到它不再嵌套,可以拆分串行。而async await的写法更加趋近与同步(永远改变不了JS单线程、异步的本质,只是封装出更加同步的写法)。它的用法需要注意以下三点:
使用await,函数必须用async标识;
await后面跟的是一个Promise实例;
需要babel-polyfill;
下面附上一个例子如下,因为这个chrome浏览器还没有支持,所以这次不能直接在浏览器中直接贴代码运行,下面直接贴出代码:
而且async await的方法很好的解决了Promise链中共享变量的问题。
觉得以前对es6中async没有理解透彻,今天结合阮老师的es6一书重新理解,“async 函数返回一个Promise对象,可以使用then方法添加回调函数”。例子如下
上面的这个是一个返回状态是resolved的Promise,如果函数后面不跟.then,指定回调函数,则async函数与普通函数无异。上面的async函数转换普通函数如:
“当函数执行的时候,一旦遇到await就先返回,等到异步操作完成,再接着执行函数体后面的的语句”。表明遇到await的话将遇到阻塞,等待await后面的异步操作完成,再执行函数体里面后面的语句。
async2函数中有Promise,但是没有await,打印出的第一个Promise是result的结果,后面的Promise是async函数的返回(由第一句话可知),下面的例子是加上await,
从上图运行结果可知,await关键字阻塞了代码运行,同时result的结果不再是Promise,而是Promise对象的结果,这里就是‘3333’。await后面不是Promise对象,就直接返回对应的值。