JavaScript Promises, async/await
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:
awaitliterally 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 的协程,可以实现单线程的并发。
JavaScript Promises, async/await的更多相关文章
- 【转】6 Reasons Why JavaScript’s Async/Await Blows Promises Away (Tutorial)
原文:https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec105 ...
- [转] 理解 JavaScript 的 async/await
[From] https://segmentfault.com/a/1190000007535316 边城 2016年11月19日发布 随着 Node 7 的发布,越来越多的人开始研究据说是 ...
- 【前端_js】理解 JavaScript 的 async/await
async 和 await 在干什么 任意一个名称都是有意义的,先从字面意思来理解.async 是“异步”的简写,而 await 可以认为是 async wait 的简写.所以应该很好理解 async ...
- 理解 JavaScript 的 async/await
随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await.我第一次看到这组关键字并不是在 JavaScript 语言里,而是在 c# 5.0 的语法中.C# ...
- [转] Understanding JavaScript’s async await
PS:Promise的用处是异步调用,这个对象使用的时候,call then函数,传一个处理函数进去,处理异步调用后的结果 Promise<Action>这样的对象呢,异步调用后的结果是一 ...
- 异步模式:Callbacks, Promises & Async/Await
[译]异步JavaScript的演变史:从回调到Promises再到Async/Await https://www.i-programmer.info/programming/theory/8864- ...
- JavaScript 的 Async\/Await 完胜 Promise 的六
参考:http://www.10tiao.com/html/558/201705/2650964601/1.html Node 现在从版本 7.6 开始就支持 async/await 了. 简介: A ...
- 深入理解理解 JavaScript 的 async/await
原文地址:https://segmentfault.com/a/1190000007535316,首先感谢原文作者对该知识的总结与分享.本文是在自己理解的基础上略作修改所写,主要为了加深对该知识点的理 ...
- JavaScript 的 async/await
随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await. 异步编程的最高境界,就是根本不用关心它是不是异步. async 函数就是隧道尽头的亮光,很多人认 ...
- JavaScript 利用 async await 实现 sleep 效果
const sleep = (timeountMS) => new Promise((resolve) => { setTimeout(resolve, timeountMS); }); ...
随机推荐
- 国产电脑可较为流畅运行的Windows系统
系统是Windows2003,内置了WPS和IE8,使用QEMU TCG运行,速度慢,凑合能用. 使用前先sudo apt install qemu-system-x86,把压缩包中的2003.qco ...
- SECS半导体设备通讯-4 GEM通信标准
一 概述 GEM标准定义了通信链路上的半导体设备的行为. SECS-II标准定义了在主机和设备之间交换的消息和相关数据项.GEM标准则定义了在哪种情况下应该使用哪些SECS-II消息以及由此产生的结果 ...
- 【Java8新特性】- 接口中默认方法修饰为普通方法
Java8新特性 - 接口中默认方法修饰为普通方法 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学 ...
- PHP全栈开发(四): HTML 学习(1.基础标签+表格标签)
简单的学习一下HTML 学习HTML采用在www.runoob.com上学习的方法. 而且该网站还提供在线编辑器. 然后HTML编辑器使用Notepad++ 记得上Emmet的官网http://emm ...
- String 定义一个字符串
String 定义一个字符串,要用双引号,多个字符串用+号连接 String S = "sjosajojoaf"; System.out.println(S);
- 2、yaml配置文件当中的坑(数字的定义和支持进制书写格式)
6.进制数的转换 6.1.问题回顾 我记得我刚刚开始使用SpringBoot的时候,有一天在做到SpringBoot整合第三方技术的时候 我刚好在那天学习到整合Mybatis,做Web项目嘛,不连数据 ...
- go-zero docker-compose搭建课件服务(四):生成Dockerfile
0.转载 go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动 0.1源码地址 https://github.com/liu ...
- 8.DRF请求响应和api_view
一.请求对象(Request objects) DRF引入了一个扩展Django常规HttpRequest对象的Request对象,并提供了更灵活的请求解析能力 Request对象的核心功能是re ...
- JS常见问题总结
1. 什么是 JavaScript ? JavaScript 是一种具有面向对象的.解释型的.基于对象和事件驱动的.跨平台的.弱类型的程序设计语言 2. JavaScript 与 ECMAScript ...
- DNS 解析 prefeath
本文将详细介绍DNS预解析prefetch的主要内容 概述 DNS(Domain Name System, 域名系统),是域名和IP地址相互映射的一个分布式数据库.DNS 查询就是将域名转换成 IP ...