Async/await
的主要益处是能够避免回调地狱(callback hell)问题node
Chromium JavaScript引擎 从v5.5开始支持async/await功能,Chromium JavaScript引擎版本号的查看方法是:在浏览器地址栏输入 chrome://version,查询出来的信息以下图所示:ajax
这意味着async/await
再也不是实验性功能,使用它时无需指定--harmony
参数,此参数用来开启那些几乎已完成但被V8团队认为还不稳定的功能。不一样的node版本使用不一样的V8引擎,查看方式是:chrome
Node.js 7.6正式默认支持async/await
功能promise
在函数,匿名函数,箭头函数,变量,类中加上关键字async就好了浏览器
async function asyncFunc() {} const asyncFunc = async function() {} async function() {} async () => {} class someClass { async asyncFunc() {} }
function前面加上async关键字,表示该function须要执行异步代码。 async function函数体内能够使用await关键字,且await关键字只能出如今async function函数体内。异步
await关键字能够跟在任意变量或者表达式以前,await后面一般会跟一个异步过程,以下async
async function asyncFunc() { await somePromise; }
async function固定会返回一个promise,即使函数体里面没有调用return。因为async function返回一个promise,因此能够写在await后面,相似这样函数
async function asyncFun1() {} async function asyncFun2() { await asyncFun1(); } async function asyncFun3() { await asyncFun2(); } asyncFun3();
等效于: async function asyncFun1() {} async function asyncFun2() {} async function asyncFun3() { await asyncFun1(); await asyncFun2(); } asyncFun3();
若是有return,return后面的值都会被包装成一个promise执行正确的回调函数,因此return 'foo'会被包装成return Promise.resolve('foo')。this
componentDidMount() { const self = this; // 获取用户名 $.ajax('get_my_name') .then(name => { // 根据用户名获取我的信息 // 链式Promise return $.ajax(`get_my_info_by_name'?name=${name}`); }).then(function(info) { self.setSate({info}); }).catch(function(err) => { console.error(err); }); }
async componentDidMount() { try { // 获取用户名 const name = await $.ajax('get_my_name'); // 根据用户名获取我的信息 const info = await $.ajax(`get_my_info_by_name'?name=${name}`); this.setSate({info}); } catch(err) { console.error(err); } }
能够看出,async,await的写法更优雅spa
参考文章