报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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:42570

评论

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

高难度对话读书笔记—认知篇2

wo是一棵草

关于Java 编译Servlet或者自定义Tag,引入包的问题

谷鱼

Java

Python 自动化测试全攻略:五种自动化测试模型实战详解

葡萄城技术团队

自动化测试

Go中的HTTP请求之——HTTP1.1请求流程分析

Gopher指北

HTTP Go web Go 语言

Dolphinscheduler系统架构设计

dll

Apache DolphinScheduler

保留时序数据波动细节的一种采样算法

小清新同学

监控 时序数据库

程序执行太慢?快来学习SIMD加速技术,这个案例下的加速效果我也没想到(附带动手实验)

Optimize-Lab

优化代码 优化技巧 开源社区 simd Go 语言

如何快速制造OOM

Since

JVM OOM

架构师训练营第 1 期第 2 周学习总结

owl

极客大学架构师训练营

架构师训练营第 2 周作业

netspecial

极客大学架构师训练营

监控应用,应该监控什么?

小清新同学

云计算 运维 监控

什么才是“应用拓扑”?

小清新同学

运维 监控

自己动手写SQL执行引擎

无毁的湖光

Java MySQL 数据库 Linux 算法

java安全编码指南之:可见性和原子性

程序那些事

Java java安全编码 java编码指南 java安全编码指南

三步带你开发一个短链接生成平台

葡萄城技术团队

Java SpreadJS Node

项目实战,动态增删form表单

麦洛

jquery 克隆

MySQL varchar类型最大值,原来一直都理解错了

架构精进之路

MySQL varchar

上班路上也是一道美景

xcbeyond

生活 摄影 摄影征文

不一样的面向对象(二)

书旅

php 面向对象

如何设计Go语言中的channel

soolaugust

channel goroutines Go 语言

架构师训练营第二周作业

尹斌

从大数据的角度来谈谈运维监控这件事儿

小清新同学

运维 监控

刷爆朋友圈的字节跳动编码题,今天把解析思路分享下!

Java架构师迁哥

架构师训练营第 1 期第 2周作业

owl

极客大学架构师训练营

2B还是2C,这真是个问题

MavenTalker

SaaS

架构师训练营第二周学习总结

尹斌

架构师训练营第 1 期第二周课后练习题

Leo乐

极客大学架构师训练营

收藏+下载!Flink 社区最全学习渠道汇总

Apache Flink

flink

缓存解决方案-技术专题-Caffeine Cache

码界西柚

难得干货,揭秘支付宝的2维码扫码技术优化实践之路

JackJiang

支付宝

RN运行项目报错:Unable to resolve module `./debugger-ui/debuggerWorker.js` from ``

凌宇之蓝

ios android React Native

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