// async/await 是ES7引入的新语法 可以更加方便的进行异步操作
先了解一下async的语法特点 他是修饰在函数前面的

  async function queryData() {return 'hello world';
}

只有一个作用, 它的调用会返回一个promise 对象,调用一下看看就知道了,怎么调用?async 函数也是函数,所以它的调用和普通函数的调用没有什么区别,直接加括号调用就可以了,为了看结果,console.log 一下

async 的作用确实是返回一个promise 对象 ,且有State 和Result 如果async 函数有返回值 当调用该函数时,内部会调用Promise.solve() 方法把它转化成一个promise 对象作为返回, 但如果queryData函数内部抛出错误呢?

 async function queryData() {throw new Error('rejected');}console.log(queryData());

就会调用一个promise.reject ()返回一个Promise 对象

 那么要想获取到async 函数的执行结果,就要调用promise的then 或catch 来给它注册回调函数,

     async function queryData() {return 'hello word'}queryData().then(data=>{console.log(data)})

如果async 函数执行完,返回的promise 没有注册回调函数,比如函数内部做了一次for 循环,你会发现函数的调用,就是执行了函数体,和普通函数没有区别,唯一的区别就是函数执行完会返回一个promise 对象。

 async function queryData() {for (let index = 0; index < 3; index++) {console.log('async '+ index);}}console.log(queryData());


async关键字差不多了 最重要的一点async 函数的执行会返回一个promise对象 ,并且会把内部的值进行promise的封装如果promise 对象通过then catch方法又注册回调函数 async 函数执行完毕以后 注册的回调函数就会放到异步队列中去 等待执行 如果是async 和promise 差不多,但是有了await 就不一样了 await 是只能在async函数里面 await 是等待的意思 他后面可以跟着任何表达式 不过 我们更多的是放一个返回promise 对象的表达式 他等的是promise 对象的执行完毕 并返回结果

现在写一个函数,让它返回promise 对象,该函数的作用是2s 之后让数值乘以2

 // 2s 之后返回双倍的值
function doubleAfter2seconds(num) {return new Promise((resolve, reject) => {setTimeout(() => {resolve(2 * num)}, 2000);} )
}

现在再写一个async 函数,从而可以使用await 关键字, await 后面放置的就是返回promise对象的一个表达式,所以它后面可以写上 doubleAfter2seconds 函数的调用

async function testResult (){let result = await doubleAfter2seconds(10)console.log(result)
}

现在调用testResult 函数

testResult();

打开控制台,2s 之后,输出了20.
分析代码执行过程
调用testResult 遇到了await await表示等待 代码就暂停到这里 不再向下执行 等待后面的的promise 对象执行完毕 让后拿到promise resolve 的值并进行返回 返回值拿到之后 它继续向下执行 。具体代码分析 遇到awiat 停止 执行 等到doubleAfterseconds(10)执行完毕 , doubleAfterseconds(30)返回的promise 开始执行 2秒之后 promise resolve 并返回值为20 这时await才拿到了值20 然后赋给result 暂停接收 代码继续执行 执行cosnol语句

就这一个函数,我们可能看不出async/await 的作用,如果我们要计算3个数的值,然后把得到的值进行输出呢?

async function testResult() {let first = await doubleAfter2seconds(30);let second = await doubleAfter2seconds(50);let third = await doubleAfter2seconds(30);console.log(first + second + third);
}
testResult()

6秒后,控制台输出220, 我们可以看到,写异步代码就像写同步代码一样了,再也没有回调地域了

这里强调一下等待,当js引擎在等待promise resolve 的时候,它并没有真正的暂停工作,它可以处理其它的一些事情,如果我们在testResult函数的调用后面,console.log 一下,你发现 后面console.log的代码先执行。

async function testResult() {let first = await doubleAfter2seconds(30);let second = await doubleAfter2seconds(50);let third = await doubleAfter2seconds(30);console.log(first + second + third);
}
testResult()
console.log('先执行')

async awit 的用法思考相关推荐

  1. javascript async awit 和 Promise 概述

    async awit概述 async函数可能包含0个或者多个await表达式.await表达式会暂停整个async函数的执行进程并出让其控制权,只有当其等待的基于promise的异步操作被兑现或被拒绝 ...

  2. 浅谈async函数await用法

    async和await相信大家应该不陌生,让异步处理变得更友好. 其实这玩意儿就是个Generator的语法糖,想深入学习得去看看Generator,不然你可能只停留在会用的阶段. 用法很简单,看代码 ...

  3. async awit 实现axios继发与并发

    在使用async awit之前先确定项目支不支持(不支持报 regeneratorRuntime is not defined) 使用webpack搭建的项目可使用 这里 提供webpack配置支持 ...

  4. async awit 异步调用的理解及应用

    async awit 异步调用的理解及应用 async 是"异步"的简写,而 await 可以认为是 async wait 的简写.所以应该很好理解 async 用于申明一个 fu ...

  5. promise 与async awit的写法

    async awit 是 Generator 的一个语法糖 如有不对,望指出

  6. 前后端交互(Promise、fetch、axios、async/awit用法)

    1.Promise概述 Promise是异步编程的一种解决方案,从语法上讲,Promise是一个对象,从它可以获取异步操作的消息. 1.2Promise的好处: 1.2.1. 可以避免多层异步调用嵌套 ...

  7. ES6中的promise、async、await用法详解

    <!DOCTYPE html> <html> <head><title>Promise.async.await</title> </h ...

  8. Promise/async awit/fetch 学习笔记

    Promise 一.Promise 1.then()方法 2.catch()方法 3.finally()方法(实际开发中并不常用) 4.Promise.resolve()和Promise.reject ...

  9. async awit

    语法 [return_value] = awit express 表达式 一个promise或者任何需要等待的值(data.result) 返回值 返回Promise 对象的处理结果.如果等待的不是P ...

最新文章

  1. 什么是标签传播算法?为什么要使用标签传播算法?如何使用?
  2. 太赞了!NumPy 手写所有主流 ML 模型,由普林斯顿博士后 David Bourgin打造的史上最强机器学习基石项目!...
  3. struts2 action之间参数的传递
  4. 使用栈结构实现中缀转后缀算法(python)
  5. 【MM系列】SAP 簇表 A017 物料信息记录 (指定工厂) 包含的透明表
  6. Excel多因素不重复方差分析
  7. 女子多年未住别墅成剧组拍摄地,网友:看个剧才想起自己还有栋别墅
  8. Python使用多线程搜索指定范围内的所有素数
  9. 引用类型 —— Array类型
  10. android获取当前显示的view,Android中ViewPager获取当前显示的Fragment
  11. 离圆心最远的整数点(微软笔试题)
  12. 47页数字孪生人脸识别轨迹分析电子围栏智慧工地解决方案
  13. 多台服务器集群部署方案
  14. 三个极限定理与四种收敛性
  15. clcl.bz index.php,BZPHP
  16. 怎么翻译Word文档?这里有Word文档翻译小妙招
  17. [组图教程]:8大方法!解决CPU资源占用100%[ZT]
  18. centos7:yum -y install gcc python36-devel bzip2-devel sqlite-devel openssl-devel readline-devel xz-d
  19. 多普达硬启动方法整理
  20. 地球生命为啥只选择碳基生命,而不是硅基生命呢?

热门文章

  1. 51单片机的4×4键盘识别与74LS164驱动数码显示
  2. 普中51开发板利用1602LCD与1302时钟芯片来显示时间的程序
  3. python制作数据库报表_如何制作数据报表并实现自动化?
  4. 排序算法之一——冒泡排序
  5. 2021年质量员-市政方向-通用基础(质量员)最新解析及质量员-市政方向-通用基础(质量员)复审考试
  6. 优雅地解决 WSL 开栈问题
  7. 轻量化前端框架与小程序移动开发
  8. antd学习之Affix固钉的学习
  9. 提问的智慧—如何更好地提问题和回答问题 CSDN开发者互助问答平台测评「CSDN问答」测评
  10. 全国本科高校就业信息网站汇总