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

时间:2015-07-24 15:19:49

标签: javascript node.js es6-promise

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 { then: () => {} }内返回“假承诺”(function a())而不是“真正的承诺”如果doNotResolve是真的,但感觉有点粗糙。

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

1 个答案:

答案 0 :(得分:4)

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

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

  1. 不会触发then处理程序(除非你提供两个回调,这被认为是不好的做法)
  2. 触发显式处理错误的catch处理程序
  3. 仍然触发finally处理程序
  4. 您可以这样做:

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

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

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

    根据您的实现,永远不会拒绝或解析承诺会将其留在挂起的承诺堆栈中,并且很可能在您的页面卸载或节点承诺退出时抛出或记录错误。我知道Bluebird会抱怨你是否已经保留任何未决的承诺,因为它通常表示代码的异步部分中存在错误。