JavaScript – Async Iterator & Generator
前言
要看懂这篇请先看下面几篇
JavaScript – Generator Function
JavaScript – 用 Generator 运行异步函数 & await async
Async Iterator (es2018)
es6 推出的 Iterator + for...of 非常好用, 但是它只能执行同步代码. 不支持异步编程.
顾名思义 Async Iterator 就是 Iterator 的 Async 版本. 它支持异步编程.
我们来看看 sync 和 async Iterator 的对比
sync Iterable
const iterable: Iterable<string> = {
[Symbol.iterator]() {
let index = 0;
return {
next() {
index++;
if (index === 10) {
return {
done: true,
value: '',
};
}
return { done: false, value: 'value' + index };
},
};
},
};
for (const value of iterable) {
console.log('value', value);
}
async Iterable
const asyncIterable: AsyncIterable<string> = {
[Symbol.asyncIterator]() {
let index = 0;
return {
async next() {
return new Promise((resolve) => {
setTimeout(() => {
index++;
if (index === 10) {
resolve({
done: true,
value: '',
});
}
return resolve({ done: false, value: 'value' + index });
}, 1000);
});
},
};
},
};
(async () => {
const asyncIterator = asyncIterable[Symbol.asyncIterator]();
const { value, done } = await asyncIterator.next();
console.log([value, done]);
for await (const value of asyncIterable) {
console.log('value', value);
}
})();
和 sync iterable 的区别是
1. 属性是 Symbol.asyncIterator
2. iterator next 返回的是一个 promise, promise 的返回才是 done 和 value
3. 遍历的方式是 for await ... of
你可能会认为, sync iterable 也可以返回 promise 丫.
的确. 在 JavaScript – 用 Generator 运行异步函数 & await async 里有提到如何用 Generator + Iterator + Promise + 自执行 Generator 来实现异步编程 (async await 语法糖的背后的原理)
它的 iterator next value 返回的就是 promise. 但不要忘了, 还有 done 属性呢? 这个总不能返回 Promise 了丫. 所以还是有细微区别的.
Async Generator (es2018)
和 Async Iterator 一样概念. Generator 也有 Async 版本.
function delayAsync(time: number, value: string) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(value);
}, time);
});
}
async function* myGenerator() {
yield delayAsync(1000, 'a');
console.log('do something');
yield delayAsync(1000, 'b');
}
(async () => {
const asyncIterator = myGenerator();
for await (const value of asyncIterator) {
console.log(value);
}
// 1000ms after log a
// do something
// another 1000ms after log b
})();
和 sync Generator 的区别是
1. async function* 多了 async 关键字开头
2. yield 返回 Promise
3. 可以用 for await...of 遍历
for...of + Promise.all 对比 for await...of
当有一堆 promises 想 loop 的时候, 在 for await...of 出现前. 通常是搭配 Promise.all 来使用的
const promises = [delayAsync(1000, 'a'), delayAsync(2000, 'b')];
(async () => {
for (const value of await Promise.all(promises)) {
console.log(value);
}
for await (const value of promises) {
console.log(value);
}
})();
几时知识点:
1. 当 delayAsync 调用时, setTimeout 马山就执行了. 所以下面这 2 个 timeout 是一起 start 的哦
const promises = [delayAsync(1000, 'a'), delayAsync(2000, 'b')];
2.
for (const value of await Promise.all(promises)) {
console.log(value);
}
await Promise.all 返回 array 后才进入 for...of. 所以在 2 秒钟后 log a 和 log b 会马上执行 (同步, 中间没有间隔时间)
3.
for await (const value of promises) {
console.log(value);
}
和 for...of 不同, 它会先去 loop, 所以会先拿出第一个 promise, 等待. 1 秒钟后就会执行 log a.
然后再拿第 2 个 promise. 这时 promise2 已经过去 1 秒了, 所以再 1 秒钟后就会只是 log b.
一定要搞清楚它们执行的顺序和时机哦.
JavaScript – Async Iterator & Generator的更多相关文章
- ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await
ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...
- JavaScript中的Generator函数
1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...
- 前端Tips#6 - 在 async iterator 上使用 for-await-of 语法糖
视频讲解 前往原文 前端Tips 专栏#6,点击观看 文字讲解 本期主要是讲解如何使用 for-await-of 语法糖进行异步操作迭代,让组织异步操作的代码更加简洁易读. 1.场景简述 以下代码中的 ...
- Javascript async异步操作库简介
异步操作知识 在js世界中, 异步操作非常流行, nodejs就是特点基于异步非阻塞. js语言支持的异步语法包括, Promise async await generator yield. 这些语 ...
- symbol,iterator,generator
1.symbol是在ES6中引入的一种基本数据类型,因为symbol是不重复.唯一的数据特性,symbol设计是被用来表示对象内部的私有属性的. symbol.for与symbol.keyfo ...
- JavaScript async/await:优点、陷阱及如何使用
翻译练习 原博客地址:JavaScript async/await: The Good Part, Pitfalls and How to Use ES7中引进的async/await是对JavaSc ...
- ES 6 proimse &&iterator &&Generator函数 &&async
1.proimse 异步调用function getData(){ let promise =new Promise((resolve,reject)); let xmlHttp =new XMLHt ...
- decorator, async/await, generator
////////////decorator////////// function aopFunc (target, key, descriptor) { console.log('aopFunc') ...
- 学习笔记:javascript中的Generator函数
最近在学习redux-saga,由于redux-saga需要使用Generator函数,所以下来就回顾了一下Generator Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为 ...
- python3:iterable, iterator, generator,抽象基类, itertools的使用。
目录: iterable对象 iterator对象, 数据类型Iterator类 数据类型Generator类. 生成器表达式 collections.abc:容器的抽象基类.用于判断具体类. ite ...
随机推荐
- 最简GIF解析代码gif_jumper,用于stb_image的小改进
gif jumper gif支持多帧动画,但是没有存储总帧数,解析gif直到结束才能知道总帧数. 所以gif解析代码,要么采用链表,要么不停realloc()分配内存,stb_image的代码就是如此 ...
- 安装PHP拓展
win环境下: php扩展下载地址:http://pecl.php.net/ 需要知道: php版本,操作系统位数,线程是否安全.想要知道这3个,在php中输入.如下图所示:phpinfo();di ...
- [oeasy]python0116_文字的起源_苏美尔文明_楔形文字_两河流域
文字起源 回忆上次内容 上次回顾了西里尔字符的编码过程 KOI-7 KOI-8 ISO-8859 系列进行总结 字符扩展 ascii 共 16 种 由iso组织制定 从 iso-8859-1 到 ...
- oeasy教您玩转vim - 41 - # 各寄存器
各寄存器 回忆上节课内容 上次是复制粘贴 y就是把东西yank到寄存器里,就是复制 d就是把东西delete到寄存器里,就是剪切 yank也可以配合motion 不管是yank.delete都是把 ...
- Python 正则表达式实战之Java日志解析
需求描述 基于生产监控告警需求,需要对Java日志进行解析,提取相关信息,作为告警通知消息的内容部分. 提取思路 具体怎么提取,提取哪些内容呢?这里笔者分析了大量不同形态的生产日志,最后总结出4种形态 ...
- java面试一日一题:讲下mysql中的锁
问题:请讲下在mysql中的锁 分析:该问题主要考察对中锁的掌握,主要考察的是读.写锁.行锁.间隙锁.next-key,其他还有表锁.意向锁 回答要点: 主要从以下几点去考虑, 1.mysql中的锁有 ...
- OpenAI深夜丢炸弹硬杠谷歌搜索
这几年科技变革太快,AI更是飞速发展,作为一名IT老兵,使用过的搜索引擎也是一换再换.这不,刚消停了一段时间的OpenAI又丢出一个炸弹SearchGPT,直接跟谷歌掀桌子了. 1.谷歌搜索的无奈 早 ...
- 小狼毫&雾凇拼音安装及部署-Windows(图文)
小狼毫输入法和雾凇拼音主题安装以及配置步骤 先上资源链接 小狼毫官网:RIME | 中州韻輸入法引擎 小狼毫Github地址:rime/weasel: [小狼毫]Rime for Windows (g ...
- RHCA cl210 013 制作镜像 轮转key rabbitmq追踪 写时复制 keystone多域登录图形界面
undercloud 部署 overcloud overcloud控制节点上的组建rabbitmq 排错需要rabbitmq,开启追踪则会更详细,会消耗性能 环境问题 登录一下classroom os ...
- python global将结果存储起来给另外一个文件对象使用
python global将结果存储起来给另外一个文件对象使用 使用场景: 在aaa.py文件里面操作数据生成结果C 然后再在bbb.py文件里面使用C 下面是aaa.py代码: #!/usr/bin ...