首页 > 解决方案 > 如何从布尔检查内联返回承诺?

问题描述

我是新来的承诺语法。以前我有这样的代码,请求会返回一个 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 });
    };
};

标签: javascriptpromise

解决方案


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

(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."));
//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}

推荐阅读