Javascript 为什么我会得到一个“;Promise executor已使用非未定义的参数调用;警告(Node.js)

Javascript 为什么我会得到一个“;Promise executor已使用非未定义的参数调用;警告(Node.js),javascript,node.js,promise,Javascript,Node.js,Promise,我正在尝试使用承诺在Node.js(v12.20.1)中创建一个流/惰性列表。我的基本想法是,一个流可以只是一个承诺,解析为一个值和另一个流。考虑到这一点,我提出了这个递归定义: 类流扩展了承诺{ 建造商(执行人){ 超级((解决、拒绝)=> 执行人( (值)=> 决心({ 头:价值, 尾部:新流(执行器), }), 拒绝 ) ); } 地图(f){ 返回这个。然后((单元格)=>{ 返回{ 头部:f(单元头部), tail:cell.tail.map(f), }; }); } } 现在,这实

我正在尝试使用承诺在Node.js(v12.20.1)中创建一个流/惰性列表。我的基本想法是,一个流可以只是一个承诺,解析为一个值和另一个流。考虑到这一点,我提出了这个递归定义:

类流扩展了承诺{
建造商(执行人){
超级((解决、拒绝)=>
执行人(
(值)=>
决心({
头:价值,
尾部:新流(执行器),
}),
拒绝
)
);
}
地图(f){
返回这个。然后((单元格)=>{
返回{
头部:f(单元头部),
tail:cell.tail.map(f),
};
});
}
}
现在,这实际上完成了我所期望的一切,但每当解析一个值时,就会打印出两条警告消息。例如,使用事件发射器作为流的源:

>const Stream=require(“./Stream”)
未定义
>const{EventEmitter}=require('events')
未定义
>常量发射器=新的EventEmitter();
未定义
>const stream=新流((yieldValue,拒绝)=>emitter.once('foo',yieldValue));
未定义
>stream.map(console.log);
流[承诺]{}
>emit('foo',1);
真的
> 1
(节点:22271)未处理的PromisejectionWarning:TypeError:Promise executor已使用未定义的参数调用
at/wd/stream.js:4:13
在新的承诺()
在新的流中(/wd/Stream.js:3:9)
at/wd/stream.js:8:31
在处理和拒绝时(内部/process/task_queues.js:97:5)
(节点:22271)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志“---unhandled rejections=strict”(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (拒绝id:1)
(节点:22271)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。
>emit('foo',2);
真的
> 2
(节点:22271)未处理的PromisejectionWarning:TypeError:Promise executor已使用未定义的参数调用
at/wd/stream.js:4:13
在新的承诺()
在新的流中(/wd/Stream.js:3:9)
at/wd/stream.js:8:31
在处理和拒绝时(内部/process/task_queues.js:97:5)
(节点:22271)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志“---unhandled rejections=strict”(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (拒绝id:2)
我真的不明白这里出了什么问题。我不明白多次调用executor有什么问题,因为它只是一个函数,我当然也不明白是什么导致了第二次警告,因为据我所知,这里没有拒绝任何承诺


提前感谢您的帮助

问题是,
this.then()
按照您已子类化的
promise
构造函数的约定构造一个新的promise。为此,它调用您的
构造函数,其中的执行器将使用传递的解析器函数来解析带有
然后
回调结果的新承诺。此执行器预计只被回调一次-但是您的
确实多次调用它,一次立即调用,然后在
解析
调用期间调用

您的
stream.map(console.log)构建的各种承诺从未在任何地方处理过的呼叫,有些似乎被拒绝-如果你问我的话,这是正确的

流可以由递归链接的承诺1组成,但流不是
承诺
。不要使用子类化


1:有关示例,请参见或。请注意,这个类似链表的概念现在已被()取代,它有一个有状态的
next()
方法。您还需要看看。

您是否可能正在尝试设计一些已经存在的东西?节点已具有流类。它不是promise的子类,但它确实有一个promise api,其中异步方法返回promises。@danh Yeah,我这样做更多是为了学习:)