Async/await的主要益处是可以避免回调地狱(callback hell)问题

Chromium JavaScript引擎 从v5.5开始支持async/await功能,Chromium JavaScript引擎版本号的查看方法是:在浏览器地址栏输入 chrome://version,查询出来的信息如下图所示:

这意味着async/await不再是实验性功能,使用它时无需指定--harmony参数,此参数用来开启那些几乎已完成但被V8团队认为还不稳定的功能。不同的node版本使用不同的V8引擎,查看方式是:

Node.js 7.6正式默认支持async/await功能

async-await语法介绍

在函数,匿名函数,箭头函数,变量,类中加上关键字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 function asyncFunc() {
await somePromise;
}

async function的返回值

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')。

React中使用jQuery $.ajax Promise避免回调地狱的语法

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);
});
}

React中使用async,await的避免回调地狱的语法

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的写法更优雅

参考文章

[1]7.6默认支持Async/Await

[2] Hey async,await me

[3] 如何在浏览器使用 async/await

ES8 async/await语法的更多相关文章

  1. Python PEP 492 中文翻译——协程与async/await语法

    原文标题:PEP 0492 -- Coroutines with async and await syntax 原文链接:https://www.python.org/dev/peps/pep-049 ...

  2. ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题

    转载请注明原文地址: ReactNative的fetch是天然的异步请求,因此,如果你在一个代码块中使用了fetch,那么在执行的时候程序不会等待网络响应结束才执行下一条代码,而是会直接按顺序执行完整 ...

  3. C#Framework4.0支持异步async/await语法

    由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...

  4. 重新认识 async/await 语法糖

    提起.Net中的 async/await,相信很多.neter 第一反应都会是异步编程,其本质是语法糖,但继续追查下去,既然是语法糖,那么经过编译之后,真正的代码是什么样的,如何执行的?带着这些疑问, ...

  5. 抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext

    长话短说,本文带大家抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext 引言 C#异步编程语法糖async/await,使开发者很容易就能编写异步代码. ...

  6. python3.6以上 asyncio模块的异步编程模型 async await语法

    这是python3.6以上版本的用法,本例是python3.7.2编写使用asyncio模块的异步编程模型,生产这消费者,异步生产,用sleep来代替IO等待使用async和await语法来进行描述a ...

  7. Async/await语法糖实现(Generator)

    // generator也是一种迭代器(Iterator) 有next方法,并返回一个对象{value:...,done:...} function run(generatorFunction) { ...

  8. 让webpack打包支持ES7的async/await语法

    npm install --save-dev babel-plugin-transform-runtime npm install --save babel-runtime .babelrc配置 { ...

  9. Async/Await替代Promise的6个理由

    译者按: Node.js的异步编程方式有效提高了应用性能:然而回调地狱却让人望而生畏,Promise让我们告别回调函数,写出更优雅的异步代码:在实践过程中,却发现Promise并不完美:技术进步是无止 ...

随机推荐

  1. 分组PARTITION BY及游标CURSOR的用法

    基础数据表: select * from dbo.RecommendationChanelVersionRelation: 数据如下: 要求按照ChannelVersionID分组,对每组中的Orde ...

  2. rpmbuild analysis

  3. CodeForces 671C - Ultimate Weirdness of an Array

    题意: 给以一个定义, F(l, r) 的值表示序列 A[1:n]的子序列 A[1....(l-1),(r+1)...n] 之中 任意两个数的最大公约数的最大值. 求 Sum=∑i=1N∑j=1N(F ...

  4. 浅谈rest風格的接口开发

    简单描述:因为前后端分离,开发完模块之后,接到team leader的指令,我这个渣渣javaer需要给前端人员返回一个接口,具体内容是课程列表json和分类列表json.emmmm,第一次写接口,心 ...

  5. 测开之路十:函数&参数

    def 函数名(): 函数代码块 return 返回值 参数 必备参数:位置参数,调用函数时必须有值传入 默认参数,调用如果没有传值使用默认值 不定长参数 *args:想传多少传多少,必须放在位置参数 ...

  6. Iterator 和 ListIterator 的不同点以及包含的方法

    当我们在对集合(List,Set)进行操作的时候,为了实现对集合中的数据进行遍历,经常使用到了Iterator(迭代器).使用迭代器,你不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就 ...

  7. Windows Internals 笔记——线程调度

    1.线程内核对象中的CONTEXT反应了线程上一次执行时CPU寄存器的状态.大约每隔20ms,Windows都会查看所有当前存在的线程内核对象.Windows在可调度的线程内核对象中选择一个,并将上次 ...

  8. Redis实战 - 5事务:multi、exec和watch

    介绍 redis的目标的是: 简洁,高效,由于事务本身就是一个很复杂的东西,所有我们不能把事务做的太复杂. DISCARD 取消事务,放弃执行事务块内的所有命令. EXEC 执行所有事务块内的命令. ...

  9. C# Conversion Keywords

    主要是解决类与其他不同数据类型的转换 类于类的显式转换: explicit  public static explicit operator B(A a) { return new B(){a.... ...

  10. 【webpack系列】从零搭建 webpack4+react 脚手架(五)

    本章节,我们一起来探讨以下问题:如何对编译后的文件进行gzip压缩,如何让开发环境的控制台输出更加高逼格,如何更好的对编译后的文件进行bundle分析等. 1 gzip压缩 如果你想节省带宽提高网站速 ...