Javascript 无限异步迭代器未按预期工作
因此,我试图创建一个无限异步迭代器/生成器。 代码应该向“for wait of”循环生成Hello和Hi,然后永远等待下一个值。问题在于,它不等待第三个值,也不在循环后打印2,并且在没有错误的情况下终止 在节点v12.14.0上运行ts节点Javascript 无限异步迭代器未按预期工作,javascript,node.js,typescript,asynchronous,Javascript,Node.js,Typescript,Asynchronous,因此,我试图创建一个无限异步迭代器/生成器。 代码应该向“for wait of”循环生成Hello和Hi,然后永远等待下一个值。问题在于,它不等待第三个值,也不在循环后打印2,并且在没有错误的情况下终止 在节点v12.14.0上运行ts节点 class Source<T> { _data: T[] = []; _queue: ((val: T) => void)[] = []; send(val: T) { if (this._q
class Source<T> {
_data: T[] = [];
_queue: ((val: T) => void)[] = [];
send(val: T) {
if (this._queue.length > 0) {
this._queue.shift()!(val);
} else {
this._data.push(val);
}
}
next(): Promise<{ done: boolean, value: T }> {
return new Promise((resolve, _reject) => {
if (this._data.length > 0) {
resolve({ done: false, value: this._data.shift()! });
} else {
this._queue.push(value => resolve({ done: false, value }));
}
});
}
[Symbol.asyncIterator]() {
return this;
}
}
(async () => {
const s = new Source<String>();
s.send("Hello");
s.send("Hi");
console.log(1);
for await (let str of s) {
console.log(str);
}
console.log(2);
})();
未解决的承诺不会阻止退出流程。看一看
只要有一个明确的承诺和一个遵循它的链条,这个过程就会继续运行。由于在for wait之前调用了几次s.send,循环中的前两次迭代已经解决了承诺问题,因此需要运行更多的代码。在此之后,它正在等待一个未解析的承诺,这使您对async=>{…}的调用成为一个未解析的承诺。不再运行代码,进程将退出
为了解决这个问题,你可以做一些讨厌的事情,比如setInterval=>{},99999999。只要安排了超时,进程就不会退出
我花了一段时间才弄明白,在什么情况下,我们希望这种行为不要等到所有承诺都得到解决或拒绝后才退出
设p1=Promise.1,
p2=新承诺=>{}.thenPromise.resolve2,
p3=Promise.race[p1,p2].thenconsole.log;
p2将永远无法解决,p3的承诺。比赛呼叫不会取消p2。但是,我们希望这个程序打印1然后退出。您可以使用编译好的js并在调试器中逐步完成代码。嗯,我只是用调试器逐步完成了。我无法解释这种行为。看起来,未解决的承诺不会阻止程序退出。newpromise=>{}.then=>console.log'foo';马上离开。我觉得奇怪的是,只要你继续调用s.send,程序就会一直运行。这可能是因为只要调用s.send,队列中的承诺就会解析,因此程序有更多的代码要运行?不等待第三个值是什么意思?代码中没有第三个值。async=>{setInterval=>{},999999;…}解决了此问题