【发布时间】:2020-07-26 14:20:24
【问题描述】:
我有一个生成器方法,它可以将一些东西异步添加到数组中,最后生成带有yield* array 的每个成员,如下所示:
while (!done) {
await promise;
yield* results; //<-- the array
results = []; //its emptied so as to not to yield dupes
done = !this.#eventsListened.has(eventName);
}
但是我们友好的邻居 tsc 报告了一个错误,我什至无法理解它或如何修复它。谁能解释这个错误是什么意思,我应该如何产生一个数组的内容?
TS2766:无法将迭代委托给 value,因为“next”方法 其迭代器的期望类型为“未定义”,但包含的生成器 将始终发送“未知”。
编辑:整个生成器函数如下
/**
* Returns an iterator that loops over caught events
* @yields Promise<Event|CustomEvent>
*/
async *on(eventName: string, options?: AddEventListenerOptions): AsyncGenerator<Event> {
if (this.#eventsListened.has(eventName)) {
return;
}
let results: Event[] = [];
let resolve: (value?: PromiseLike<Event> | Event) => void;
let promise = new Promise<Event>(r => (resolve = r));
let done = false;
this.#eventsListened.add(eventName);
if (typeof options === 'object' && typeof options.once !== 'undefined') {
throw new Error('options.once is not supported. Use EventTarget2.once instead');
}
const callback = (evt: Event) => {
results.push(evt);
resolve();
promise = new Promise<Event>(r => (resolve = r));
};
this.addEventListener('eventName', callback, options);
while (!done) {
await promise;
yield* results;
results = [];
done = !this.#eventsListened.has(eventName);
}
this.removeEventListener(eventName, callback);
}
【问题讨论】:
-
您是真的要使用
yield*还是需要普通的yield? -
@VLAZ 我的意思是 yield* 我想单独产生数组的每个成员
-
需要更多上下文(主要是
function*定义)。 -
问题是
.next(stuff)会将一个值传递给迭代器,而yield*也会传递给数组迭代器。数组迭代器的类型为Iterator<void, T, undefined>,因此您只能将其称为.next(),但是您的生成器函数的类型不同(或根本没有)。因此.next(...)调用冲突。
标签: javascript arrays typescript async-await generator