JavaScript虽无传统协程,但可通过生成器和异步迭代器实现类似功能:1. 生成器函数(function)配合yield可暂停并恢复执行;2. 异步生成器(async function)结合for await…of能处理异步数据流;3. 利用run函数调度生成器可模拟协程,管理复杂异步流程。

JavaScript中没有传统意义上的“协程”,但通过生成器(Generator)和异步迭代器,可以实现类似协程的行为。这些特性让函数能够暂停执行、保留状态,并在之后恢复,非常适合处理异步流程和数据流控制。
生成器:实现可暂停的函数
生成器函数使用 function* 定义,调用后返回一个迭代器对象。它可以通过 yield 暂停执行,外部通过 next() 控制恢复。
这种机制允许我们手动控制执行流程,模拟协程的“挂起”与“恢复”行为。
立即学习“Java免费学习笔记(深入)”;
function* simpleCoroutine() { console.log('Step 1'); yield 'Paused after step 1'; console.log('Step 2'); yield 'Paused after step 2'; return 'Done';}const it = simpleCoroutine();it.next(); // 输出 Step 1,返回 { value: 'Paused after step 1', done: false }it.next(); // 输出 Step 2,返回 { value: 'Paused after step 2', done: false }it.next(); // 返回 { value: 'Done', done: true }
异步迭代器与 for await…of
异步迭代器是返回 { value, done } 的 Promise 对象的迭代器。配合 for await…of 可以简化异步数据流的消费,比如读取分页数据或事件流。
定义异步迭代器最简单的方式是使用异步生成器函数:async function*,它结合了 async/await 和 yield。
立即学习“Java免费学习笔记(深入)”;
async function* asyncNumbers() { let i = 0; while (i setTimeout(resolve, 1000)); yield ++i; }}// 使用 for await...of 消费异步迭代器(async () => {for await (const num of asyncNumbers()) {console.log(num); // 每秒输出 1, 2, 3}})();
模拟协程调度
利用生成器的暂停与恢复能力,可以实现一个简单的协程调度器。这种模式在早期 Promise 普及前常用于管理异步流程(如 co 库)。
立即学习“Java免费学习笔记(深入)”;
function run(generatorFn) { const iterator = generatorFn();function handle(result) {if (result.done) return result.value;return Promise.resolve(result.value).then(res => handle(iterator.next(res)),err => iterator.throw(err));}
try {return handle(iterator.next());} catch (error) {return Promise.reject(error);}}
// 使用 run 执行“协程”run(async function*() {const a = yield fetch('/api/data1').then(r => r.json());const b = yield fetch('/api/data2').then(r => r.json());console.log(a, b);});
基本上就这些。虽然现代 JavaScript 更多使用 async/await,但生成器和异步迭代器依然在处理复杂异步流、惰性求值和自定义控制流时非常有用。理解它们有助于深入掌握 JS 的执行模型。
以上就是JavaScript协程与异步迭代器实现的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/4329.html
微信扫一扫
支付宝扫一扫