我有一个返回Promise的函数。
现在,有时消费者在Promise上使用“then”功能是有意义的。但有时消费者根本不关心Promise什么时候解决,也不关心结果 - 换句话说,同样的功能也应该能够以“一劳永逸”的方式被调用。
所以我想要这两种使用场景:
func().then( ... ); // process Promise
func(); // "fire and forget"
这显然有效,但我想知道这是否被视为“不良做法”,特别是如果这种使用模式可能有任何不必要的副作用,即。导致内存泄漏?现在我正在使用蓝鸟,但是如果有任何不同,我会考虑切换到原生的Promises。
答案 0 :(得分:5)
请记住,每次拨打then
都会产生新的承诺。因此,任何由于承诺没有附加任何解析处理程序而导致内存泄漏的Promise实现将是一个破坏的实现,所有这些承诺,我们永远不会挂钩处理程序返回。我非常怀疑ES2015承诺的实施,Bluebird,Q等都有这种行为。
另外,从概念上讲,承诺的解析处理程序基本上只是承诺存储的函数,然后在适当时调用,如果你从未给它存储任何函数,那么它不太可能是内存泄漏
但是,你的发作存在问题,只是没有内存泄漏问题:它违反了一个主要的Promise规则:要么处理拒绝,要么将promise链返回给其他会处理拒绝的东西。由于您没有这样做,如果操作失败,您将遭受未处理的拒绝。未处理的拒绝被报告给控制台,并且在某些环境中可能会终止您的应用程序(在某些时候,Node.js可能会在发生这种情况时开始终止该过程,请参阅this open issue)。
如果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.then got a p2.then got b