js异步遍历器(asyncIterator)

本文介绍在阅读阮一峰的ES6入门教程时,如何解决遇到的`createAsyncIterable is not defined`问题。作者决定自行实现这个异步遍历器功能,并通过实践发现其实现并不复杂,测试了async和await的功能,结果符合预期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阮大大的 ES6 入门对于我这种菜鸟来说真是太棒了!
在看 27. 异步遍历器 时,遇到的一个问题,createAsyncIterable is not defined
然后查阅的了一下,才知道异步遍历器现在是一个草案,与是冒出一个念头,这个 createAsyncIterable 函数能不能自己实现了。
j s c o d e js code jscode

function createAsyncIterable(obj) {
  let asyncList;

  if (typeof obj === "string") asyncList = obj.split("");
  else if (Array.isArray(obj)) asyncList = [...obj];
  else throw new Error("Type is error");

  let index = 0;
  const limit = asyncList.length;

  return {
    [Symbol.asyncIterable]() {
      return {
        next() {
          return new Promise((resolve, reject) => {
            if (index < limit) {
              resolve({ value: asyncList[index++], done: false});
            } else {
              resolve({ value: undefined, done: true});
            }
          });
        }
      }
    }
  };
}

const asyncIterable = createAsyncIterable(["a", "b"]);
const asyncIterator = asyncIterable[Symbol.asyncIterable]();

asyncIterator
  .next()
  .then((iterResult1) => {
    console.log(iterResult1); // { value: "a", done: false }
    return asyncIterator.next();
  })
  .then((iterResult2) => {
    console.log(iterResult2); // { value: "b", done: false }
    return asyncIterator.next();
  })
  .then((iterResult3) => { // { value: undefined, done: true }
    console.log(iterResult3);
  });

console.log("This is a asyncIterable");

对于我来说已经是极限了,,,开始写的时候觉得好难,但是尝试了一下发现其实很容易。。
然后,测试了一下async和await,也是ok的=。=,结果完全相同

async function f() {
  const asyncIterable = createAsyncIterable(['a','b']);
  const asyncIterator = asyncIterable[Symbol.asyncIterable]();

  console.log(await asyncIterator.next());
  console.log(await asyncIterator.next());
  console.log(await asyncIterator.next());
}
f();
console.log("This is a asyncIterable");
南无阿弥陀佛
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值