我有一个返回 Promise 的函数。
现在,有时消费者在该 Promise 上使用“then”功能是有意义的。但有时消费者根本不关心 Promise 何时解析,也不关心结果 - 换句话说,相同的函数也应该能够以“即发即忘”的方式调用。
所以我想要这两种使用场景:
func().then( ... ); // process Promise
func(); // "fire and forget"
这显然是有效的,但我想知道这是否被认为是“不好的做法”,特别是这种使用模式是否可能产生任何不需要的副作用,即。导致内存泄漏?现在我正在使用 bluebird,但如果这有什么区别的话,我考虑切换到原生 Promises。
请记住,每次调用then
带来新的承诺。因此,任何由于 Promise 没有附加任何解析处理程序而导致内存泄漏的 Promise 实现都将是一个损坏的实现,所有这些承诺我们永远不会挂钩返回的处理程序。我非常怀疑 ES2015 的承诺、Bluebird、Q 等的实现是否有这种行为。
另外,从概念上讲,promise 的解析处理程序基本上只是由promise 存储的函数,然后在适当的时候调用,因此如果您从不给它任何要存储的函数,则不太可能会出现内存泄漏。
But,您的“即发即弃”存在问题,而不是内存泄漏问题:它破坏了主要的 Promise 规则之一:要么处理拒绝,要么将 Promise 链返回到其他将处理拒绝的东西。由于您没有这样做,因此如果操作失败,您将收到未处理的拒绝。未处理的拒绝会报告给控制台,并且在某些环境中可能会终止您的应用程序(在某些情况下,Node.js 可能会在发生这种情况时开始终止进程,请参阅这个悬而未决的问题).
如果事实是then
返回一个新的 Promise 是一个惊喜,考虑一下:
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.then got a
p2.then got b
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)