javascript - 如何从布尔检查内联返回承诺?
问题描述
我是新来的承诺语法。以前我有这样的代码,请求会返回一个 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 });
};
};
解决方案
您可以使用三元运算符将函数的主体内联为单个表达式:
(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."));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
推荐阅读
- azure-ad-b2c - Azure b2c 注册
- javascript - 如何在不重复的情况下运行脚本
- javascript - 如何进行多个 Fetch 调用
- javascript - Express.js 和 PDFKit:另存为文件,流产生空文件
- google-apps-script - 我有一个应用程序脚本代码,可以很好地复制我需要复制字母的数字,这可能吗?
- c++ - 头文件破坏了一个程序,但在另一个程序中工作
- amazon-web-services - 在 2 个容器实例(ECS 实例)上运行 ECS 服务
- python - 如何在图例上显示数据标签
- javascript - 为 JS 项目使用模块和 webpack:为什么我会收到“未捕获的 ReferenceError”
- flutter - 如何修复 Flutter 构建问题期间调用的 setState