如何从布尔检查内联返回承诺?

时间:2019-08-07 13:35:44

标签: javascript promise

我是新来的诺言语法。以前我有这样的代码,并且请求将返回一个zipfile:

// in first file
exports.requireSubscription = function(req) {
    if (feature_is_available) {
        return Promise.resolve();
    }
    else {
        return Promise.reject(new Error("You need to upgrade your account to access this feature."));
    }
};

//from the npm package https://www.npmjs.com/package/archiver
const archiver = require("archiver");
utils.requireSubscription(req)
  .then(() => getPage(req, res, "view"))
  .then(function(page) {
    const zip = archiver.create("zip", {});
    // ...
    zip.finalize();
  }).catch(utils.fail(req, res));

现在,我想删除requireSubscription的单独功能,并使用带有检查内联的单个文件。

我已经尝试过了:

if (feature_is_available) {
  getPage(req, res, "view"))
    .then(function(page) {
      const zip = archiver.create("zip", {}); 
      // ...
      zip.finalize();
    });
} else {
  utils.fail(req, res);
}

但是,请求正在挂起。我认为当我应该返还一个承诺时,也许我没有返还一个承诺-以前requireSubscription返还了一个承诺,但现在我的内联检查却没有。

如何重写此代码以返回正确的内容?

更新:这是utils.fail函数:

exports.fail = function(req, res) {
    return function(error) {
        if (error instanceof acl.PermissionDeniedError) {
            return res.status(403).render("error_nothing_here.html", { user: req.user, error: error });
        }
        else if (error instanceof errors.NotFoundError) {
            return res.status(404).render("error_nothing_here.html", { user: req.user, error: error });
        }
        res.status(500).render("internal_error.html", { "error": error });
    };
};

1 个答案:

答案 0 :(得分:0)

您可以使用三元运算符将函数的主体作为单个表达式内联:

(feature_is_available
  ? Promise.resolve()
  : Promise.reject(new Error("You need to upgrade your account to access this feature."))
).then(() =>
  getPage(req, res, "view")
).then(page => {
  const zip = archiver.create("zip", {});
  // ...
  zip.finalize();
}).catch(utils.fail(req, res));

您的版本存在以下问题:承诺链没有附加catch处理程序,并且您没有在fail()分支中调用else创建的函数。你需要写

if (feature_is_available) {
  getPage(req, res, "view"))
  .then(page => {
    const zip = archiver.create("zip", {}); 
    // ...
    zip.finalize();
  })
  .catch(utils.fail(req, res));
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
} else {
  utils.fail(req, res)(new Error("You need to upgrade your account to access this feature."));
//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}