new Promise() 的时候,传一个 executor 给 Promise.

let promise = new Promise(function(resolve, reject) {
// this function will executes immediately
})

这个函数会立刻被执行,在 executor 里面调用了 resolve 之后, Promise 变为 fulfilled,在 executor 里面调用了 reject 之后,Promise 变为 rejected。如果 resolve 和 reject 都还没被调用,Promise 的状态是 pending(等待结果)。.then/.catch/.finally都是异步的,JavaScript 是单线程模型,所有的异步任务都将被放到任务队列里,等主线程的所有的代码执行完然后才执行任务队列里的任务。JavaScript 是单线程,也就是所有的异步代码都会等到 JS 文件里面的代码都执行完了才执行。

setTimeout() 是异步的,不会阻塞函数执行,所以 let promise 立刻得到了 Promise 对象。Promise 的 state 和 result 都是内部的,不能直接访问。要拿到 result, 就要使用 .then 或者 .catch 方法,传一个接受结果的函数给他们。Promise.resolve() 就相当于 new Promise(resolve => resolve())Promise.reject() 相当于是 new Promise((resolve, reject) => reject())

.then.catch 都是返回一个 Promise 对象,而 Promise 对象有 then 和 catch 方法,所以可以链起来。这个 undefined 是 console.log(r) 的输出。

在 then 里面也可以 return new Promise(...)1。对于错误处理,executor 外部有一个隐式的 try...catch,也就是说 executor 执行流的异常会被后来最近的 .catch() 调用捕获到,没有捕获的的错误最后会被抛到 window,或者全局。值得注意的是 .catch() 处理异常以后也会返回一个 Promise 对象。

async 意味着函数一定返回一个 Promise,如果函数正常 return,return 的结果在一个 resolved Promise 里面。.then() 里面可以返回一个 Promise,在 async 函数里面也可以显式的返回一个 Promise。

await 不是单纯的等待,不是阻塞的等待,literally suspends the function execution,实际上是挂起这个函数的执行,或者说暂停这个函数的执行,等 Promise settle 也是就是等 Promise 有结果之后,然后 resume(恢复)执行。这就有点像是生成器的 yield,从上次打断的地方恢复执行。await 挂起/暂停的时候会CPU执行其他的异步任务,await 有等待的意思,不过实际上还有让步,会将执行权让给其他的任务,等其他的任务执行完或者其他的任务让步以后,然后继续之前 await 的地方执行。具体会运行到哪个异步任务,得看当时任务队列里面有什么任务在等待执行。

Let’s emphasize: await literally suspends the function execution until the promise settles, and then resumes it with the promise result. That doesn’t cost any CPU resources, because the JavaScript engine can do other jobs in the meantime: execute other scripts, handle events, etc.

await 会去调用.then(),获取 Promise 的结果。async/await 使得调用异步函数,不需要写回调了,也不需要一直 .then,异步代码就像普通的代码一样。

初学 JavaScript 的 async/await,以为 await 就是阻塞的等待,后来了解到协程,发现 async/await 是一个比较通用的关于协程的关键字。这其实就是 JavaScript 的协程,可以实现单线程的并发。

最新文章

  1. ThinkPhp 3.2 数据的连贯操作
  2. Android Monkey测试(转载)
  3. Tomcat中文乱码问题的原理和解决方法
  4. The Run-Time Constant Pool The Constant Pool
  5. 传统高斯模糊与优化算法(附完整C++代码)
  6. windows中的上帝模式开启方法
  7. 【转】android 内存泄漏相关收藏博客。
  8. struts2 查 找总结
  9. 《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误
  10. Unity3d 模拟视锥的实现
  11. JS indexOf() lastIndexOf()与substring()截取字符串的区别
  12. keepalived工作原理
  13. git中级技能
  14. “百度杯”CTF比赛 十二月场_blog(kindeditor编辑器遍历,insert注入,文件包含)
  15. 【转】Python之道
  16. Java list.remove( )方法需要注意的地方
  17. 从PyMongo看MongoDB Read Preference
  18. 一个简单的windows勒索软件分析
  19. TS和C#的差异
  20. Tensorflow 中的优化器解析

热门文章

  1. centos7安装sonarqube-9.2.4
  2. 高光谱图像分类简述+《Deep Learning for Hyperspectral Image Classification: An Overview》综述论文笔记
  3. NSIS查找文本中是否包含某个字串
  4. img通过修改css等比例缩小图片
  5. NOI2015 洛谷P1955 程序自动分析(并查集+离散化)
  6. TomCat之安装
  7. ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)
  8. Hadoop生态系统—数据仓库Hive的安装
  9. SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
  10. 系统整理K8S的配置管理实战-建议收藏系列