ES6之async函数(1)知识点总结(十二)

news/2024/7/10 23:11:17 标签: ES6, async

每天集中精力学一会ES6,效果还是蛮好的,嗯,跟着阮一峰大神学功夫喽,如果你也见识见识阮一峰大神的神功,请点击http://es6.ruanyifeng.com/#docs/async

async函数的写法和语法:

1、async函数就是将Generator函数的星号替换成async,将yield替换成await

2、async函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体后面的语句。

  const Genera =   function * (){
        yield .....
    }
  const asy =  async function (){
      const a = ...
  }

async函数对Generator函数的改进。

  • 内置执行器:Generator函数的执行必须靠执行器,而async函数自带执行器,async函数的执行,与普通函数一模一样
  • 更好的语义:async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。
  • 适用性更广:co模块约定,yield命令后面只能是Thunk函数或Promise对象,而async函数的await命令后面,可以是Promise对象和原始类型(数值、字符串和布尔值,但这时等同于同步操作)
  • 返回值是Promise对象:比Generator函数的返回值是Iiterator对象方便多了。可以用then方法指定下一步的操作。

async函数的语法:

async函数返回一个Promise对象,async函数内部return语句返回的值,会成为then方法回调函数的参数。

    async function fn(){
        return "donna";
    }
    fn().then(f=>console.log(f));//donna

async函数内部抛出错误,会导致返回的Promise对象变为reject状态,抛出的错误对象会被catch方法回调函数接收到。

    async function fn(){
        throw new Error("错了错了")
    }
    fn().then(f=>console.log(f),e=>console.log(e));//Error: 错了错了

async函数返回的Promise对象,必须等到内部所有await命令后面的Promise对象执行完毕,才会发生状态改变,除非遇到return语句或者抛出错误,也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

await命令:

正常情况下,await命令后面是一个Promise对象,如果不是会被转成一个立即resolve的Promise对象。

    async function f() {
        return  await 123;
    }
    f().then(v => console.log(v));//123
    async function f() {
        return  await new Promise(resolve=>{
        resolve("leo");
    })
    }
    f().then(v => console.log(v));//leo

await命令后面的Promise对象如果变为reject状态,则reject的参数会被catch方法的回调函数接收到

注意:只要一个await语句后面的Promise变为reject,那么整个async函数都会中断执行(不论await函数前面是否有return,结果都一样)。

    async function fn(){
        await Promise.reject("错了");
        return await 123;
    }
    fn().then(v=>console.log(v),e=>console.log(e));//错了

错误处理:我们知道如果await后面的异步操作出错,那么等同于async函数返回的Promise对象被reject

所以比较好的办法1、是将await命令放在try…catch代码块中。2、await后面的Promise对象再跟一个catch方法,处理前面可能出现的错误。

使用注意点:

我们知道await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try…catch代码块中。

多个await命令后面的异步操作,如果不存在继发关系,最好让他们同时触发

await命令只能用在async函数之中,如果用在普通函数,就会报错。











http://www.niftyadmin.cn/n/952065.html

相关文章

.net事务

.net中的4种事务总结 在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考…

H5中的自定义数据属性

H5规定可以为元素添加非标准的属性,但要添加前缀data-,目的是为元素提供与渲染无关的信息,或者提供语义信息。这些属性可以任意添加,随便命名,只要以data-开头即可 添加了自定义属性后,可以通过dataset属性…

单页网站制作系统_这4个网站制作技巧,教你做美观的单页网站

现在单页面网站开始很受欢迎,技术小白做一个单页网站也比较方便省时,那么如何才能把单页面网站做得美观呢?制作网站需要哪些技巧?今天就跟大家分享4点网站首页制作技巧,教你做出好看的网站:1.网站banner 制…

Crystal Reports for Visual Studio 2005 学习一(报表绑定方案)

一. ReportDocument 对象模型的报表绑定二.CrystalReportViewer 对象模型进行报表绑定。) 转载于:https://www.cnblogs.com/zhangzheny/archive/2007/11/16/961140.html

ES6之Class类知识点总结(十三)

好的文章就要分享出来,让更多的小伙伴看到、嗯、继续推荐阮一峰大神的ES6文章,真的很棒,关于Class类的知识,想要了解的更清楚的建议到大神的官网走一走http://es6.ruanyifeng.com/#docs/class-extends 我们知道ES5及之前是没有类的…

SQL Server 2005 SQL Server 2000 改进

SQL Server 2005相对于SQL Server 2000改进很大,有些还是非常实用的。 举几个例子来简单说明 这些例子我引用了Northwind库。 1. TOP 表达式 SQL Server 2000的TOP是个固定值,是不是觉得不爽,现在改进了。 --前n名的订单declarenintsetn10se…

利用bootstrap实现的响应式导航条

响应式导航条,在不同屏幕大小显示的效果不同,先看一下效果上面是在PC端显示的效果上面的是在小屏幕上显示的效果上面是当我们点击三横的时候,导航条上的文字出现了 看完效果我来总结一下用到的知识点: 总体上涉及到的知识点有导航…

(转)解决AJAX中使用UpdatePanel后再用Response.Write();等无法弹出对话框问题 3法

在AJAX支持的网站中使用想使用Response.Wrie(“”); 或 Page. RegisterStartupScript (); 弹出一些提示对话框,没有效果。有如下两种解决方法:(1) System.Web.UI.ScriptManager.RegisterStartupScript来替代Page.ClientScrip…