我必须履行我的JavaScript承诺吗?

在Node.js环境中,如果我这样做:

var doNoResolve = true; function a() { return new Promise(resolve => { if (doNotResolve) { return } resolve(10); }); } a().then(() => { // I don't want this getting fired }); 

在传入的请求,这是一个内存泄漏? 如果我使用一个普通的旧callback,如果我没有执行任何callback提供的东西,那么一切都会变好,但是这种感觉可能不是这样的……名字的承诺意味着这是错误的。

如果我必须在doNotResolve为true的情况下返回一个“假承诺”( return { then: () => {} } )在function a()而不是“真正的承诺”

特别的用例是一个同构的React.js应用程序,我不想让HTTP请求实际得到(但是我希望我的商店更新到一个导致加载图标出现的状态)。

你为什么要这样做,而不是拒绝?

承诺的好处在于它们允许解决和拒绝,即:

  1. 不会触发then处理程序(除非您提供两个callback,这被认为是不好的做法)
  2. 是否触发catch处理程序,它显式处理错误
  3. 仍然发射finally处理程序

你可以简单地做:

 function a() { return new Promise((resolve, reject) => { if (doNotResolve) { reject(new Error('Oh noes!')); } resolve(10); }); } 

任何好的Promise实现都会给你一个来自你所称的reject位置的堆栈跟踪,以帮助你debuggingasynchronous代码,以及调用任何catch / finally处理程序:

 a().then(val => { console.log('Got data:', val); }).catch(err => { console.error(err); }).finally(() => { console.log('Done!'); }); 

从不拒绝或解决承诺将取决于您的实现,将其留在未决的承诺堆栈上,并且当您的页面卸载或节点承诺退出时,很可能会抛出或logging一个错误。 我知道蓝鸟会抱怨,如果你有任何悬而未决的承诺,因为它通常表明你的代码的asynchronous部分内的错误。