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 ...
随机推荐
- [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式
utf-8 回忆上次内容 上次再次输出了大红心<span style="color:red"></span> 找到了红心对应的编码 黑红梅方都对应有编码 ...
- [rCore学习笔记 03]配置rCore开发环境
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 rCo ...
- TIER 1: Crocodile
TIER 1: Crocodile nmap 在前几次练习中,我们已经熟悉 nmap 扫描,我们在本次靶机中使用继续使用 nmap 进行扫描. 扩充我们的知识库:-sC 选项启用了 Nmap 的默认脚 ...
- JavaScript小面试~宏任务和微任务
首先,我们要知道JavaScript是单线程调用,在程序启动的时候,会把不同的代码段分派到不同的调用栈,同步任务在同步栈中直接执行,宏任务分派到宏任务栈,微任务会分配到微任务栈,分配好之后,调用栈会被 ...
- ComfyUI插件:IPAdapter_plus(新版)节点
ComfyUI插件:IPAdapter_plus(新版)节点 前言: 学习ComfyUI是一场持久战,而IPAdapter_plus是常用且便捷有效的风格迁移模型,可以通过提供参考图像去进行图像的生成 ...
- 初读nginx.conf
学成在线里教的部署门户,记录一下NGINX的部分配置是如何使用的 location块用于定义如何处理不同URL请求 1.代理: server { listen 80; server_name file ...
- 【DataBase】SQL50 Training 50题训练
原文地址: https://blog.csdn.net/xiushuiguande/article/details/79476964 实验数据 CREATE DATABASE IF NOT EXIST ...
- 【转载】 Tensorflow学习笔记-模型保存与加载
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lovelyaiq/article/det ...
- 新购的HP品牌台式机(暗影精灵,自带windows10系统,显卡为RTX2080,CPU为i7-10700)安装双系统(Ubuntu系统),不识别显卡,不识别硬盘 —— 解决方案
事件起因是实验室的师弟要弄深度学习,实验室为其新购一台台式机(HP台式机,暗影精灵,自带windows10系统,显卡为RTX2080,CPU为i7-10700),师弟是满心喜悦的在windows系统上 ...
- anaconda运行install命令报错:Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)'
运行命令: conda install mpi4py 报错: Retrieving notices: ...working... ERROR conda.notices.fetch:get_chann ...