当我不使用Promise的"then"功能时,是否存在任何(负面)副作用?

fro*_*dev 7 javascript promise

我有一个返回Promise的函数.

现在,有时消费者在Promise上使用"then"函数是有意义的.但有时消费者根本不关心Promise什么时候解决,也不关心结果 - 换句话说,同样的功能也应该能够以"一劳永逸"的方式被调用.

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

func().then( ... ); // process Promise
func(); // "fire and forget"
Run Code Online (Sandbox Code Playgroud)

这显然有效,但我想知道这是否被认为是"不良做法",特别是如果这种使用模式可能有任何不必要的副作用,即.导致内存泄漏?现在我正在使用蓝鸟,但我认为如果有任何不同,可以切换到原生Promise.

T.J*_*der 5

请记住,每次致电都会then带来新的承诺。因此,任何由于没有附加任何解析处理程序而导致的承诺而导致内存泄漏的Promise实现都将是一个破损的实现,对于所有这些诺言,我们永远不会将处理程序挂接到返回。我非常怀疑ES2015的诺言,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);
});
Run Code Online (Sandbox Code Playgroud)

哪个输出

p1。然后得到一个
p2。然后得到b