前言

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

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. Tiny RDM 刚上线就收获一众好评的Redis桌面开源客户端!值得拥有!

    相信对Redis有频繁操作需求的用户,大部分会选择一个顺手的图形化界面工具来代替手动命令行操作以提高效率.Tiny RDM作为一款现代化轻量级的跨平台Redis桌面客户端,为用户提供了便捷高效的Red ...

  2. iOS开发基础99-内购in_app

    今天后台支付校验模块报错,拿到凭证去苹果校验返回的结果如下: { "receipt": { "receipt_type": "Production&q ...

  3. SQL_left join 和from 两个表的区别

    一个是普通的联接,结果中的记录在两个表中都有.一个是左外联接,结果中的记录在A表中存在,B表中不一定有.相当于a表为主体表,b为辅助表. 例子: mysql> select * from a;+ ...

  4. 在Django中查找重复项目

    在Django中查找重复项目通常涉及使用查询集(QuerySet)和模型(Model).假设你有一个模型,比如Item,你想查找其中重复的项目,可以通过以下步骤来实现: 确定重复的标准: 首先需要确定 ...

  5. 2023HACSP-J补测

    都快忘了自己还打过这个比赛了,所以来补一下. 完整题目在这里查看. Day0 来到郑州,寻找考场.幸好提前来了,因为考场大门就 5m 宽(HA用不用这么穷啊喂,来JZYZ不好么),开车转了 20min ...

  6. 测试思想-流程规范 用例优先级定义与使用规范 V1.0

    用例优先级定义与使用规范 V1.0 By:授客   1.      规范说明 目的 对软件测试过程中的用例级别进行详细描述及标准化定义,明确不同测试阶段的测试范围,减少测试冗余投入,提高测试效率,建立 ...

  7. 关于SpringBoot中事务回滚没有生效

    在SpringBoot中,事务回滚可以用注解@Transactional标识. Spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作. 1.非检查型异常 ...

  8. 写写Redis十大类型zset的常用命令

    其实这些命令官方上都有,而且可读性很强,还有汉化组翻译的http://redis.cn/commands.html,不过光是练习还是容易忘,写一写博客记录一下 从zset类型开始写||zset类型适合 ...

  9. ceph 003 对osd操作 对存储池操作 存储池配额 存储池快照 pgp

    主机被加入集群时,会自动被分配角色以达到集群的默认状态.(mon,mgr之类) 想要超过默认状态可以进行设置 ceph容器与客户端 ceph集群的客户端 需要 ceph-common 软件包 ceph ...

  10. Vue Vine:带给你全新的 Vue 书写体验!

    你好,我是 Kagol,个人公众号:前端开源星球. 上个月和 TinyVue 的小伙伴们一起参加了 VueConf 24 大会,有幸认识沈青川大佬,并了解了他的 Vue Vine 项目,Vue Vin ...