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 ...
随机推荐
- 3.5 Y84-64的流水线实现
我们终于准备好要开始本章的主要任务--设计一个流水线化的Y86-64处理器.首先,对顺序的SEQ处理器做一点小的改动,将PC的计算挪到取指阶段.然后,在各个阶段之间加上流水线寄存器.到这个时候,我们的 ...
- 暑假Java自学每日进度总结1
今日所学: 一.常用的cmd命令: 1>盘符: 2>dir(显示当前文件所有目录) 3>cd 目录(打开该目录) 4>cd..(回到上一目录) 5>cd(回到当前盘符初始 ...
- Django查询特定条件的数据并插入其他表格模型
要将特定 wk_nu 值对应的数据批量插入到 MPS005D3Model 中,你可以执行以下步骤: 确定要插入的 wk_nu 值. 获取与该 wk_nu 相关的数据. 将获取的数据逐一创建为 MPS0 ...
- 【JavaScript高级01】JavaScript基础深入
1,数据类型 JavaScript将数据分为六大类型,分别为数值类型(number).字符串类型(string).布尔类型(boolean).undefined(定义未赋值).null(赋值为空值). ...
- idea使用git管理项目(Mac版)
1.本地安装git mac版 breaw install git 查看是否安装成功 git --version 这样就成功了,一般是自带的有 windows版 https://www.cnblogs. ...
- 新项目加入mybatisplus,我给自己挖了个坑 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 上述问题的解决办法:1首先看看@mapp ...
- EdgeOne安全专项实践:上传文件漏洞攻击详解与防范措施
前言 今天,我们将深入探讨上传文件漏洞攻击,这部分内容是EdgeOne专项实践篇的一部分.在本章中,我们不会涉及文件漏洞的含义.原理或站点配置等基础教程,如果你对这些内容感兴趣,可以参考这篇文章:探索 ...
- Jmeter循环控制器
循环控制器(Loop Controller),循环控制器会将该控制器里面所有请求循环运行指定次数 循环次数:勾选"永远"则程序会一直循环运行不会停止,不勾选"永远&quo ...
- 【MySQL】下发功能SQL
SQL参考文章: https://www.jb51.net/article/15627.htm 下发,就是从别的表中同步数据到此表中,也可能是来自不同库的表,或者不同实例的表 下发的逻辑要求:如果没有 ...
- 【Maven】下载安装(Linux)
Maven官网下载地址: http://maven.apache.org/download.cgi 点选这个压缩包 wget或者上传都行 解压 tar -zxvf apache-maven-3.6.3 ...