Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无限异步迭代器未按预期工作_Javascript_Node.js_Typescript_Asynchronous - Fatal编程技术网

Javascript 无限异步迭代器未按预期工作

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

因此,我试图创建一个无限异步迭代器/生成器。 代码应该向“for wait of”循环生成Hello和Hi,然后永远等待下一个值。问题在于,它不等待第三个值,也不在循环后打印2,并且在没有错误的情况下终止

在节点v12.14.0上运行ts节点

 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;…}解决了此问题