前言

要看懂这篇请先看下面几篇

JavaScript – Iterator

JavaScript – Generator Function

JavaScript – Promise

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的更多相关文章

  1. ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await

    ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...

  2. JavaScript中的Generator函数

    1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...

  3. 前端Tips#6 - 在 async iterator 上使用 for-await-of 语法糖

    视频讲解 前往原文 前端Tips 专栏#6,点击观看 文字讲解 本期主要是讲解如何使用 for-await-of 语法糖进行异步操作迭代,让组织异步操作的代码更加简洁易读. 1.场景简述 以下代码中的 ...

  4. Javascript async异步操作库简介

    异步操作知识 在js世界中, 异步操作非常流行, nodejs就是特点基于异步非阻塞. js语言支持的异步语法包括, Promise  async await generator yield. 这些语 ...

  5. symbol,iterator,generator

    1.symbol是在ES6中引入的一种基本数据类型,因为symbol是不重复.唯一的数据特性,symbol设计是被用来表示对象内部的私有属性的.     symbol.for与symbol.keyfo ...

  6. JavaScript async/await:优点、陷阱及如何使用

    翻译练习 原博客地址:JavaScript async/await: The Good Part, Pitfalls and How to Use ES7中引进的async/await是对JavaSc ...

  7. ES 6 proimse &&iterator &&Generator函数 &&async

    1.proimse 异步调用function getData(){ let promise =new Promise((resolve,reject)); let xmlHttp =new XMLHt ...

  8. decorator, async/await, generator

    ////////////decorator////////// function aopFunc (target, key, descriptor) { console.log('aopFunc') ...

  9. 学习笔记:javascript中的Generator函数

    最近在学习redux-saga,由于redux-saga需要使用Generator函数,所以下来就回顾了一下Generator Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为 ...

  10. python3:iterable, iterator, generator,抽象基类, itertools的使用。

    目录: iterable对象 iterator对象, 数据类型Iterator类 数据类型Generator类. 生成器表达式 collections.abc:容器的抽象基类.用于判断具体类. ite ...

随机推荐

  1. 解决方案 | Claunch 如何更新配置文件

    1.问题 比如我的电脑上有Claunch 3.26版本(绿色版本),但是更新的时候如何保证我的新版本的图标.链接也更新是个问题. 官网说得比较模糊: 2.解决方法 打开复制data数据覆盖到新版本同样 ...

  2. Vue this.$refs的使用

    ref 写在标签上时:this.$refs.名字 获取的是标签对应的dom元素 ref 写在组件上时:这时候获取到的是子组件的引用

  3. 超级炫酷的终端神器 eDEX-UI

    目录 eDEX-UI主要亮点: 优点: 软件简介 安装 Linux Windows 效果 更换皮肤 matrix Tron-disrupted 退出 常见问题解答 eDEX-UI,不仅是一款全屏幕.跨 ...

  4. oeasy教您玩转vim - 9 - # 换行插入

    插入新行 回忆上节课内容 上上次是 i.I 在光标前面插入 又加了 a.A 可以在光标后面插入 a 是在光标后插入 A 是在当前行最后插入 关于插入,还有什么命令吗? 我们继续去查阅 help :h ...

  5. vue小知识:多层数据双向相应之向上派发和向下派发($dispatch和$broadcast)

    注意:这两个实例已经在vue3中弃用啦!!!(所以不详细说了,封装知道怎么用就行了,作为了解) 都是在vue实例配置(main.js) 向上派发:$dispatch 注意,在相应后代组件中使用 thi ...

  6. Pycharm+pytest+allure打造高逼格的测试报告

    环境前置提示:allure是基于Java的一个程序,需要Java1.8的环境,没有安装需要去安装一下. 如果在cmd中能输入java,获取到命令信息则不管,否则需要配置系统变量: 路径:计算机> ...

  7. Jmeter函数助手25-log

    log函数用于记录一条日志并返回其值. String to be logged (and returned):函数会返回该值.控制台也能看到该字符 Log level (default INFO) o ...

  8. 为团队配置Linux环境,简单高效的项目共享方案

    前言 最近好久没写博客了,事情太多了,我还搞了个新的好玩的项目,等后续做得差不多了来写篇文章介绍一下. 在我们目前的AI项目中,团队需要共同使用一台GPU服务器来做模型训练和数据处理.为了让每个团队成 ...

  9. 【JavaWeb】 接口鉴权

    一年前写过一篇,叫Webservice校验机制,叫法不太对,就是接口鉴权 https://www.cnblogs.com/mindzone/p/15078436.html 这东西就是说,你提供给外部的 ...

  10. 【Java】File 文件类

    File 文件类 File类的一个对象,代表了一个文件和一个文件目录/文件夹 File类所属在java.io 的包下 构造器部分 - 以parent为父文件,child为子路径创建File对象,可以理 ...