Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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_Promise - Fatal编程技术网

Javascript 当我不';不要使用;然后";承诺的功能?

Javascript 当我不';不要使用;然后";承诺的功能?,javascript,promise,Javascript,Promise,我有一个函数,它返回一个承诺 现在,有时消费者在该承诺上使用“then”函数是有意义的。但有时,消费者根本不关心承诺何时解决,也不关心结果——换句话说,同样的函数也应该能够以“开火并忘记”的方式调用 所以我想要这两种使用场景: func().then( ... ); // process Promise func(); // "fire and forget" 这显然有效,但我想知道这是否被视为“坏习惯”,尤其是这种使用模式是否会产生任何不必要的副作用,即导致内存泄漏?现在我正在使用蓝鸟,但是

我有一个函数,它返回一个承诺

现在,有时消费者在该承诺上使用“then”函数是有意义的。但有时,消费者根本不关心承诺何时解决,也不关心结果——换句话说,同样的函数也应该能够以“开火并忘记”的方式调用

所以我想要这两种使用场景:

func().then( ... ); // process Promise
func(); // "fire and forget"

这显然有效,但我想知道这是否被视为“坏习惯”,尤其是这种使用模式是否会产生任何不必要的副作用,即导致内存泄漏?现在我正在使用蓝鸟,但是如果有任何不同的话,我考虑转换为本地的承诺。

< P>记住,每次调用<代码>然后< /代码>都会产生新的承诺。因此,由于承诺没有附加任何解析处理程序而导致内存泄漏的任何承诺实现都将是一个失败的实现,因为所有这些承诺我们永远不会让处理程序返回。我非常怀疑ES2015承诺的实现,蓝鸟、Q等都有这种行为

另外,从概念上讲,promise的解析处理程序基本上只是promise存储的函数,然后在适当的时候调用,如果您从未给它任何要存储的函数,那么它不太可能是内存泄漏

但是您的fire and forget存在一个问题,而不是内存泄漏问题:它违反了一个主要的承诺规则:要么处理拒绝,要么将承诺链返回到其他将处理拒绝的东西。由于您没有这样做,如果操作失败,您将面临未经处理的拒绝。未经处理的拒绝会报告给控制台,在某些环境中可能会终止您的应用程序(在某些情况下,发生这种情况时Node.js可能会开始终止进程,请参阅)

如果
然后
返回新承诺的事实令人惊讶,请考虑:

let p1=新承诺(解析=>{
设置超时(()=>{
决议(“a”);
}, 100);
});
让p2=p1。然后(结果=>{
console.log(“p1.then got”+结果);
返回“b”;
});
p2.然后(结果=>{
console.log(“p2.then got”+结果);

});+1,但我认为这不会引起任何问题。但正如您所问的内存泄漏。。我很想知道:)的可能重复(使用
async
/
await
语法,但前提是相同的)是的,Bergi听起来至少类似-很抱歉,我在搜索答案时没有找到这一点。唯一的区别是我没有使用node,我没有提到“坏习惯”部分,因为这可能是主观的。但我要指出,不使用函数的返回值是很常见的,这可以说是不承诺的等价物,即不向承诺中添加任何处理程序。@T.J.Crowder-那么您对OP“这会导致任何问题/意外副作用或内存泄漏”的回答是什么?听起来你对OP的回答是“不”,或者…?@DonCheadle-我想我在开头的一段中提到了这一点。不,它不会导致内存泄漏。:-)