我有一个返回Promise的函数。
现在,有时对于消费者来说,在该Promise上使用“ then”功能很有意义。但是有时,消费者根本不关心Promise何时解决,也不关心结果-换句话说,同样的功能也应该能够以“一劳永逸”的方式被调用。
所以我想要这两种使用场景:
func().then( ... ); // process Promise
func(); // "fire and forget"
这显然是可行的,但我想知道这是否被认为是“不良做法”,尤其是这种使用模式是否会产生任何不良副作用,即。导致内存泄漏?现在我正在使用蓝鸟,但是如果有任何不同,我会考虑切换到本地Promises。
请记住,每次致电都会then
带来新的承诺。因此,任何由于没有附加任何解析处理程序而导致的承诺而导致内存泄漏的Promise实现都将是一个损坏的实现,对于所有这些承诺,我们永远不会将处理程序挂接到返回。我非常怀疑ES2015的promises,Bluebird,Q等的实现是否具有这种行为。
另外,由于从概念上讲,诺言的解析处理程序基本上只是由诺言存储的函数,然后在适当时调用,因此,如果您从不提供任何要存储的函数,则不太可能发生内存泄漏。
但是,一劳永逸的问题出在哪里,而不仅仅是内存泄漏问题:它打破了Promise的主要规则之一:要么处理拒绝,要么将promise链返回到其他可以处理拒绝的东西。由于您未执行此操作,因此如果操作失败,则会有未处理的拒绝。未处理的拒绝会报告给控制台,并且在某些环境中可能会终止您的应用程序(有时,Node.js可能会在发生这种情况时开始终止该过程,请参阅此未解决的问题)。
如果then
返回新承诺的事实令人惊讶,请考虑:
let p1 = new Promise(resolve => {
setTimeout(() => {
resolve('a');
}, 100);
});
let p2 = p1.then(result => {
console.log("p1.then got " + result);
return 'b';
});
p2.then(result => {
console.log("p2.then got " + result);
});
哪个输出
p1。然后得到一个 p2。然后得到b
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句