"Example. Imagine -6ren">
gpt4 book ai didi

javascript - 如何 "multicast"异步迭代?

转载 作者:行者123 更新时间:2023-12-01 15:09:17 27 4
gpt4 key购买 nike

可以联系async生成器以某种方式广播或多播,以便其所有迭代器(“消费者”?订阅者?)接收所有值?
考虑这个例子:

const fetchMock = () => "Example. Imagine real fetch";
async function* gen() {
for (let i = 1; i <= 6; i++) {
const res = await fetchMock();
yield res.slice(0, 2) + i;
}
}
const ait = gen();

(async() => {
// first "consumer"
for await (const e of ait) console.log('e', e);
})();
(async() => {
// second...
for await (const é of ait) console.log('é', é);
})();

迭代“消耗”一个值,所以只有一个或另一个得到它。
我希望他们两个(以及以后的任何一个)都能获得每个 yield ed 值,如果可以以某种方式创建这样的生成器。 (类似于 Observable 。)

最佳答案

这不容易。您需要明确 tee它。这类似于 the situation for synchronous iterators ,稍微复杂一点:

const AsyncIteratorProto = Object.getPrototypeOf(Object.getPrototypeOf(async function*(){}.prototype));
function teeAsync(iterable) {
const iterator = iterable[Symbol.asyncIterator]();
const buffers = [[], []];
function makeIterator(buffer, i) {
return Object.assign(Object.create(AsyncIteratorProto), {
next() {
if (!buffer) return Promise.resolve({done: true, value: undefined});
if (buffer.length) return buffer.shift();
const res = iterator.next();
if (buffers[i^1]) buffers[i^1].push(res);
return res;
},
async return() {
if (buffer) {
buffer = buffers[i] = null;
if (!buffers[i^1]) await iterator.return();
}
return {done: true, value: undefined};
},
});
}
return buffers.map(makeIterator);
}
您应该确保两个迭代器的消耗率大致相同,这样缓冲区就不会变得太大。

关于javascript - 如何 "multicast"异步迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63543455/

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