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); }); ...
随机推荐
- Elasticsearch:Smart Chinese Analysis plugin
Smart Chinese Analysis插件将Lucene的Smart Chinese分析模块集成到Elasticsearch中,用于分析中文或中英文混合文本. 支持的分析器在大型训练语料库上使用 ...
- Opengl ES之四边形绘制
四边形的绘制在Opengl ES是很重要的一项技巧,比如做视频播放器时视频的渲染就需要使用到Opengl ES绘制四边形的相关知识.然而在Opengl ES却没有直接提供 绘制四边形的相关函数,那么如 ...
- 谣言检测(GACL)《Rumor Detection on Social Media with Graph Adversarial Contrastive Learning》
论文信息 论文标题:Rumor Detection on Social Media with Graph AdversarialContrastive Learning论文作者:Tiening Sun ...
- 第三周python作业
import datetime mot = ["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择.", "今天星期二:\n含泪播种的人一定会笑着收." ...
- 洛谷P4011 【网络流24题】 孤岛营救问题 (BFS+状压)
一道妙题啊......(不知道为什么这道题的标签是网络流,不需要用网络流啊) 如果没有门和钥匙,连边(边权为1)求最短路就行了. 但是有这两个因素的限制,我们采用分层建图的思想,一共2p层,每层对应持 ...
- Es 学习笔记 (1)
目录 前言 什么是es? es数据组织类比 应用场景 核心概念 集群 节点(node) 索引(Index) 文档类型(Type) 文档(Document) Mapping 核心简单域类型 分片(sha ...
- Linx__Ubuntu_APT
apt介绍 apt是Advanced Packaging Tool的简称. 在Ubuntu下,我们可以使用apt命令进行软件包的更新,安装,删除,清理等 类似于Windows的软件管理工具. 就是Ce ...
- 监控CPU状况并发送邮件shell脚本
#!/bin/bash #监控CPU状况并发送邮件 DATE=$(date +%y%m%d) TEMP=$(mktemp tmp.XXX.txt) cat /proc/cpuinfo >$TEM ...
- 安装 LAMP 环境(yum 版本) shell脚本
#!/bin/bash # 安装 LAMP 环境(yum 版本) # 本脚本适用于 RHEL7(RHEL6 中数据库为 mysql) yum makecache &>/dev/null ...
- SQL语句编写的练习(MySQL)
SQL语句编写的练习(MySQL) 一.建表 1.学生表(Student) 学号 | 姓名 | 性别 | 出生年月 | 所在班级 create table Student( sno varchar(2 ...