写点什么

Javascript 之 async 四重奏(二)

  • 2019-12-31
  • 本文字数:895 字

    阅读完需:约 3 分钟

Javascript之async四重奏(二)

Promise 的实例

通过 Promise 实现一个 ajax:


(注:左右/上下滑动屏幕可查看全部代码)


const getJSON = function(url) { const promise = new Promise(function(resolve, reject){   const handler = function() {     if (this.readyState !== 4) {       return;     }     if (this.status === 200) {       resolve(this.response);     } else {       reject(new Error(this.statusText));     }   };   const client = new XMLHttpRequest();   client.open("GET", url);   client.onreadystatechange = handler;   client.responseType = "json";   client.setRequestHeader("Accept", "application/json");   client.send(); 
});
return promise;};
getJSON("/posts.json").then(function(json) { console.log('Contents: ' + json);}, function(error) { console.error('Error:', error);});
复制代码


在上面的例子中我们看到的是 Promise.prototype.then()方法的使用,还有其他的方法:



虽然 Promise 有着非常灵活的使用方式,但是仍不免存在一些缺点:


无法中途取消 Promise、无法直接从外部知道 Promise 抛出的错误、无法具体了解 pending 状态中的阶段。而 Promise 的这些问题却在我们的下一个话题—generator 中得到了解决。


Generator 的顺势而为

Generator 函数

Generator 函数是 ES6 提供的一种异步编程解决方案。


语法上,可以把它理解成:Generator 函数是一个状态机,封装了多个内部状态。形式上,Generator 函数是一个普通函数。整个 Generator 函数就是一个封装的异步任务,或者说是异步任务的容器,异步操作需要暂停的地方,都用 yield 语句。


Generator 函数有两个特征:


(1)function 关键字和函数之间有一个星号(*),且内部使用 yield 表达式,定义不同的内部状态。


(2)调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象。


执行 Generator 函数会返回一个遍历器对象,可以依次遍历函数内部的每一个状态。这个遍历器对象有三个方法:next()、throw()、return().


本文转载自 Think 体验设计公众号。


原文链接:https://mp.weixin.qq.com/s/QgC2OjVF4pvltte9V_gkIQ


2019-12-31 15:42560

评论

发布
暂无评论
发现更多内容

阿里最强 Python 自动化工具开源了!

星安果

Python 开源 自动化 阿里

Javascript执行机制-任务队列

Sakura

翻译:《实用的Python编程》08_00_Overview

codists

Python

重磅功能!博睿数据APM助企业从容应对云原生架构演进

博睿数据

应用性能监控产品 Bonree Server 博睿数据 bonree

区块链数据共享平台—追踪、溯源、可信

电微13828808271

区块链+

华云大咖说 | 华云数据与海量数据携手共建国产云生态

华云数据

关于机器学习的十大常见问题

澳鹏Appen

人工智能 机器学习 深度学习 大数据 数据

Redis 客户端服务端命令数据交换

escray

redis 学习 极客时间 Redis 核心技术与实战 4月日更

GitHub爆火!银四巨作:拼多多/蚂蚁/百度面经分享

比伯

Java 架构 面试 程序人生 技术宅

基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之布局菜单嵌套路由(三)

crudapi

Vue crud crudapi quasar 路由

Linux cat 命令

一个大红包

4月日更

SumSwap节点预售关注度飙升而Uniswap V3版本却备受争议

币圈资讯

【LeetCode】寻找旋转排序数组中的最小值Java题解

Albert

算法 LeetCode 4月日更

kubectl top node报错及解决

箭上有毒

为什么主动跨数据复制在5G时代非常重要?

VoltDB

数据分析 5G VoltDB 电信

“区块链+电子处方”,医疗跟更健康

电微13828808271

面试笔记(一)事务连环炮

U2647

分布式事务 事务隔离级别 事务 4月日更

以太坊杀手?NA公链(Nirvana)Chain忠于挑战自己NAC公链

区块链第一资讯

正点原子:STM32F103(战舰)、STM32F407(探索者)、STM32F103(MINI)原理图和PCB

不脱发的程序猿

开发板 stm32 硬件设计 4月日更 正点原子

500+解决方案已搭载,英特尔新至强出道不含糊

E科讯

纹理打包器TexturePacker

空城机

UI 4月日更 Texture Packer 纹理打包器 pixi

区块链农产品质量安全溯源,保证农产品品质

13530558032

技术分享第二讲报名!

神策技术社区

大数据 活动 报名 神策

多功能工具箱Quicker+笔记软件flomo,竟然还能擦出这样的火花?

彭宏豪95

效率 工具软件 笔记 工具分享 4月日更

Python实现植物大战僵尸

不脱发的程序猿

Python GitHub 开源 游戏开发 4月日更

EFT【阿凡提】等级规则、收益、排线方法与EFTalk十大关键点

币圈那点事

语音聊天室 anyHouse 使用手册

anyRTC开发者

ios android 音视频 WebRTC RTC

[知识它]一篇文章或一本书是怎么写出来的

知识它

写作技巧 写文章 快速写作 写作方法

为什么很多SaaS叫好不叫座?

ToB行业头条

SaaS tob

团队协作中,如何写出让同事赞不绝口的代码

有道技术团队

代码规范

火山引擎 Redis 云原生实践

火山引擎开发者社区

云原生 redis cluster

Javascript之async四重奏(二)_语言 & 开发_Think体验设计_InfoQ精选文章