我是新来的诺言语法。以前我有这样的代码,并且请求将返回一个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 });
};
};
答案 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."));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}