promise原理与async 及 await

  • 1.1 Promise是一个构造函数
  • 1.2 Promise优缺点
  • 1.3 async 及 await
  • 1.4 相较于 Promise,async/await有何优势?

1.1 Promise是一个构造函数

1 Promise 是一个构造函数
我们可以创建 Promise 的实例 const p = new Promise()
new 出来的 Promise 实例对象,代表一个异步操作
2 Promise.prototype 上包含一个 .then() 方法
每一次 new Promise() 构造函数得到的实例对象,
都可以通过原型链的方式访问到 .then() 方法,例如 p.then()
3 .then() 方法用来预先指定成功和失败的回调函数
p.then(成功的回调函数,失败的回调函数)
p.then(result => { }, error => { })
调用 .then() 方法时,成功的回调函数是必选的、失败的回调函数是可选的

1.2 Promise优缺点

缺点
无法取消 Promise,错误需要通过回调函数捕获。
优点
1、当我们在构造 Promise 的时候,构造函数内部的代码是立即执行的(见下面的代码),而返回的结果是异步的Promise
2、Promise`的三种状态分别是:等待中(pending)、完成了 (resolved)、拒绝了(rejected),承诺一旦从等待状态变成为其他状态就永远不能更改状态了,也就是说一旦状态变为 resolved 后,就不能再次改变

//当我们在构造 Promise的时候,构造函数内部( new Promise)的代码是立即执行的
new Promise((resolve, reject) => {console.log('new Promise')resolve('success')
}).then(console.log('resolve'))
console.log('finifsh')
//结果 new Promise -> resolve->finifshasync function fn () {console.log('嘿嘿')const res = await fn2()console.log(res)  // 注意*****微任务,最后输出
}
async function fn2 () {console.log('gaga')
}
fn()
console.log(222)
//嘿嘿->gaga->222->undefine

3、Promise 实现了链式调用,也就是说每次调用 then 之后返回的都是一个 Promise,并且是一个全新的 Promise,原因也是因为状态不可变。如果你在 then 中 使用了 return,那么 return 的值会被 Promise.resolve() 包装(也是‘缺点’)

Promise.resolve(1).then(res => {console.log(res) // => 1return 2 // 包装成 Promise.resolve(2)}).then(res => {console.log(res) // => 2})


注意:上述的代码无法保证文件的读取顺序,需要做进一步的改进!

1.3 async 及 await

一个函数如果加上 async ,那么该函数就会返回一个 Promise
async 就是将函数返回值使用 Promise.resolve() 包裹了下,和 then 中处理返回值一样,并且 await 只能配套 async 使用;
因为 await 将异步代码改造成了同步代码(有顺序),如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低。
async关键字

  1. async关键字用于声明⼀个异步函数(如 async function asyncTask1() {…})
  2. async会⾃动将常规函数转换成 Promise,返回值也是⼀个 Promise对象
  3. async函数内部可以使⽤ await

await关键字

  1. await用于等待异步的功能执⾏完毕 var result = await someAsyncCall()
  2. await放置在 Promise调⽤之前,会强制async函数中其他代码等待(awiat之后的代码是异步微任务),直到 Promise完成并返回结果
  3. await只能在 async函数内部使⽤
async function test() {// 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式// 如果有依赖性的话,其实就是解决回调地狱的例子了await fetch(url)await fetch(url1)await fetch(url2)
}
//案例
let a = 0
let b = async () => {a = a + await 10console.log('2', a) // -> '2' 10
}
b()
a++
console.log('1', a) // -> '1' 1//输出顺序:1 1->2 10let a = 0
let b = async () => {a = a + await 10console.log('2', a) // -> '2' 10
}
b().then(console.log('3', a))
a++
console.log('1', a) // -> '1' 1//输出顺序:3 0 ->1 1->2 10
//await之后才是微任务
//这里3 0在最前面,表明B直接调用了promise的then原型,a=0
  • 首先函数 b 先执行,在执行到 await 10 之前变量 a 还是 0,因为 await 内部实现了 generatorgenerator 会保留堆栈中东西,所以这时候 a = 0 被保存了下来
  • 因为 await 是异步操作,后来的表达式不返回 Promise 的话,就会包装成 Promise.reslove(返回值),然后会去执行函数外的同步代码
  • 同步代码执行完毕后开始执行异步代码,将保存下来的值拿出来使用,这时候 a = 0 + 10

上述解释中提到了 await 内部实现了 generator,其实 await 就是 generator 加上 Promise 的语法糖,且内部实现了自动执行 generator

1.4 相较于 Promise,async/await有何优势?

1.同步化代码的阅读体验(Promise虽然摆脱了回调地狱,但 then链式调⽤的阅读负担还是存在的)
2.和同步代码更一致的错误处理方式( async/await可以⽤成熟的 try/catch做处理,比 Promise的
错误捕获更简洁直观)
3.调试时的阅读性,也相对更友好

promise原理与async 及 await相关推荐

  1. Promise讲解,async和await修饰符

    Promise的作用 Promise是Es6中的语法,用于解决异步回调的问题(回调地狱). 回调地狱:回调函数中嵌套回调 Promise解决了回调地狱 new Promise(( resolve, r ...

  2. Promise第三篇:async和await关键字

    在此之前的两篇文章已经把Promise的用法交代清楚了,Promise确实很好的解决了回调地狱等异步处理出现的问题,提高了代码的阅读性,但是在代码形式上较为复杂,还有很多回调的感觉,不易于阅读和理解. ...

  3. python await原理_JavaScript async/await原理及实例解析

    随着Node 7的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await. 异步编程的最高境界,就是根本不用关心它是不是异步. async 函数就是隧道尽头的亮光,很多人认为它 ...

  4. 面试官问 async、await 函数原理是在问什么?

    大家好,我是若川.这是 源码共读活动<1个月,200+人,一起读了4周源码> 第四期,纪年小姐姐的第四次投稿.纪年小姐姐通过本次学习提早接触到generator,协程概念,了解了async ...

  5. 掌握JavaScript中的迭代器和生成器,顺便了解一下async、await的原理

    掌握JavaScript中的迭代器和生成器,顺便了解一下async.await的原理 目录 掌握JavaScript中的迭代器和生成器,顺便了解一下async.await的原理 前言 1.迭代器(It ...

  6. JS - 15 - 异步、Promise、async、await

    Promise 类似 java 的 Callable then 方法 类似 java 的 Future 下一篇: <JS - 16 - 任务调度.宏任务.微任务.轮询> PromiseA+ ...

  7. await原理 js_JavaScript async/await原理及实例解析

    随着Node 7的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await. 异步编程的最高境界,就是根本不用关心它是不是异步. async 函数就是隧道尽头的亮光,很多人认为它 ...

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

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

  9. Async和Await异步编程的原理

    1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...

最新文章

  1. efficient分类0第一个分支训练
  2. 鸿蒙之境的称号,《神都夜行录》鸿蒙之境80级古都凶煞打法
  3. proDAD Erazr便携版
  4. centos7部署两个mysql_centos7 安装mysql5.7主从复制主写分离
  5. Qt编写数据可视化大屏界面电子看板12-数据库采集
  6. 企业网站 源码 服务邮箱:_企业网站建设对于服务器的选择至关重要
  7. 面试 .NET 开发​,为什么也要考算法?​
  8. Linux API函数总结
  9. pytorch 保存模型,加载预训练模型问题
  10. 简略谈谈AS安装的一些小问题
  11. 微信公众号基础篇(个人订阅号)
  12. 模板引擎template.js
  13. java语音识别毕业设计,HMM的语音识别技术的毕业设计
  14. 漫谈程序员系列 薪资,你是我不能言说的伤
  15. C++面向对象程序设计大作业:魔兽世界(三):开战
  16. TCS34725颜色感应识别模块
  17. 为什么你的工具类APP用户量不少,却难以找到变现模式?
  18. c语言中用temp程序,e__temp_c语言第02章作业.doc
  19. Oracle打补丁步骤
  20. html图片重叠轮播,原生JS实现层叠轮播图

热门文章

  1. 动态规划法解决矩阵连乘问题
  2. mysql主从复制1062_主从复制1062错误的解决方法
  3. klee 检测漏洞-四个实例
  4. 金字塔原理 读书心得
  5. input、textarea设置placeholder的颜色不起作用
  6. 3.python 发送邮件之smtplib模块
  7. 端到端(end-to-end)的含义
  8. 为什么PHP项目运行报错502,Nginx+PHP-FPM遇到的502报错
  9. Linux tr命令
  10. python中的闭包函数与自由变量