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

Do I have to fulfil my JavaScript promises?

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
});

对于传入请求,这是内存泄漏吗?如果我使用的是普通的旧回调,如果我不执行提供的任何回调,一切都会很好,但这感觉可能不是......这个名字 promise暗示这有点不对。

如果我不得不这样做,我可以 return 在 function a() 中使用 "fake promise" (return { then: () => {} }) 而不是 "real promise" 如果 doNotResolve 为真,但是感觉有点恶心。

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

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

承诺的好处是它们允许解决和拒绝,其中:

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

你可以简单地做:

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

任何好的 Promise 实现都会从您调用 reject 的位置为您提供堆栈跟踪 以帮助您调试异步代码,以及调用任何catch/finally 个处理程序:

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

从不拒绝或解决承诺,这取决于您的实现,将其留在未决承诺的堆栈中,并且很可能在您的页面卸载或节点承诺退出时抛出或记录错误。我知道如果您有任何待处理的承诺,Bluebird 会抱怨,因为它通常表示代码的异步部分中存在错误。