gpt4 book ai didi

javascript - 数组的内部*当前值*

转载 作者:行者123 更新时间:2023-11-30 08:36:17 25 4
gpt4 key购买 nike

我正在创建一个异步迭代的数组(为了好玩)。这很好用:

class AsyncArray extends Array {
constructor() {
super();
this.x = 0;
}

[Symbol.iterator]() {
return {
next: () => {
let promise = new Promise(resolve => setTimeout(
() => resolve(this.x++), 1000)
);
return {done: this.x >= this.length, value: promise};
}
};
}
}

async () => {
for (let x of AsyncArray.of(1, 2, 3)) {
let value = await x;
console.log(value);
}
}();

但是,这会打印出 0...1...2,因为我正在自行跟踪当前计数器并将其初始化为 x

有什么方法可以获取数组内部的当前迭代器?我还需要能够正确确定 done 值。

最佳答案

我猜你不希望计数器在你的数组内部,而是在你的迭代器中。为此在方法中使用局部变量:

[Symbol.iterator]() {
var x = 0;
return {
next: () => {
let promise = new Promise(resolve =>
setTimeout(() => resolve(this[x++]), 1000)
);
return {done: x >= this.length, value: promise};
}
};
}

不过,编写迭代器最简单的方法是使用生成器函数:

[Symbol.iterator]*() {
for (var x = 0; x < this.length; x++)
yield new Promise(resolve =>
setTimeout(() => resolve(this[x]), 1000)
);
}

这也会处理正确的 done 值(并且不会“return”一个用 undefined 解析的 promise) .


完全避免在局部变量或实例属性中跟踪状态的替代方法是使用标准数组迭代器:

[Symbol.iterator]() {
var vals = super[Symbol.iterator]();
var it = Object.create(Object.getPrototypeOf(vals)); // an array iterator
it.next = () => {
var res = vals.next();
if (!res.done)
return {done: false, value: new Promise(resolve =>
setTimeout(() => resolve(res.value), 1000)
)};
return res;
};
return it;
}

关于javascript - 数组的内部*当前值*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31138443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com