javascript - 最小化 if 语句以保持 javascript 中的可读性
问题描述
我一直在编写一个系统来处理通过 API 收到的响应,但是似乎我的整个get
函数变得非常混乱且难以管理?
处理此类语句而不是多次if
检查的正确方法是什么?
const getOrder = async (req, res) => {
let response;
console.log(req.body);
let params = await parser.parseStringPromise(req.body.parameters);
if(typeof params.PARAMETERS.ID === undefined) {
return res.send(success_response({
'STATUS': 3,
'CODE': 'Invalid Order'
}));
}
let imei = params.PARAMETERS.ID;
let solution = await client.get(imei);
if(solution === null || solution === undefined) {
response = res.send(success_response({
'STATUS': 3,
'CODE': 'Invalid Order'
}));
} else {
//check for major error first!
let check_error = await client.get('error-' + imei);
if(check_error !== null) {
await client.del('error-' + imei);
response = res.send(success_response({
'STATUS': 3,
'CODE': 'api_error'
}));
} else {
solution = JSON.parse(solution);
if (solution.orderNumber === undefined && solution.error === undefined) {
response = res.send(success_response({
'STATUS': 1
}));
}
if (solution.orderNumber !== undefined) {
const result = await orderStatus(solution.imei, solution.orderNumber, solution.token, solution.tokenRefId);
if (result.data.reason === 'EMAIL_CONFIRMATION') {
response = res.send(success_response({
'STATUS': 1
}));
} else if (result.data.unlockStatus === 'IN-PROGRESS') {
response = res.send(success_response({
'STATUS': 1
}));
} else if(result.data.unlockStatus === 'APPROVED') {
response = res.send(success_response({
'STATUS': 4,
'CODE': 'Unlocked'
}));
} else if(result.data.unlockStatus === 'DENIED') {
response = res.send(success_response({
'STATUS': 4,
'CODE': 'Denied - ' + result.data.reason
}));
} else {
response = res.send(success_response({
'STATUS': 1
}));
}
}
if (solution.error !== undefined) {
if (solution.error === 'server_error') {
response = res.send(success_response({
'STATUS': 4,
'CODE': 'server_error'
}));
} else if (solution.error === 'email_api' || solution.error === 'captcha_api') {
response = res.send(success_response({
'STATUS': 3,
'CODE': 'api_offline - ' + solution.error
}));
} else if (solution.errorCode === 'ULP_1103') {
//captcha api service provided wrong answer
response = res.send(success_response({
'STATUS': 3,
'CODE': 'Resend Order'
}));
} else {
response = res.send(success_response({
'STATUS': 4,
'CODE': solution.error
}));
}
//await client.del(imei);
}
}
}
return response;
}
解决方案
我会做一些我可以调用的辅助函数。也许是某种帮助类。
否则我会停止将后续的 if 语句嵌套在 else 语句中,让代码自然地从上到下阅读。所以这样
if(solution === null || solution === undefined) {
response = res.send(success_response({
'STATUS': 3,
'CODE': 'Invalid Order'
}));
return;
}
let check_error = await client.get('error-' + imei);
if (check_error) {
await client.del('error-' + imei);
response = res.send(success_response({
'STATUS': 3,
'CODE': 'Invalid Order'
}));
return;
}
.
.
.
如果你想编写一个函数来检查一个变量是否有任何值,你可以创建一个看起来像这样的辅助函数:
function isNullUndefinedOrEmpty(value) {
let res = (typeof value === undefined) ? true : false;
switch (value) {
case undefined:
res = true
break;
case null:
res = true
break;
case '':
res = true
break;
case '{}':
res = true
break;
default:
res = false
break;
}
if(!res) {
if(value.constructor === Object) {
if(Object.keys(value).length === 0) {
res = true
}
}
}
return res
}
这样你现在可以调用:
if(isNullUndefinedOrEmpty(solution)) {
// Value was evaluated as empty - handle error here and return
}
用于演示辅助函数的片段
function isNullUndefinedOrEmpty(value) {
let res = (typeof value === undefined) ? true : false;
switch (value) {
case undefined:
res = true
break;
case null:
res = true
break;
case '':
res = true
break;
case '{}':
res = true
break;
default:
res = false
break;
}
if (!res) {
if (value.constructor === Object) {
if (Object.keys(value).length === 0) {
res = true
}
}
}
return res
}
console.log(isNullUndefinedOrEmpty(""))
console.log(isNullUndefinedOrEmpty("Nonempty string"))
console.log(isNullUndefinedOrEmpty(undefined))
console.log(isNullUndefinedOrEmpty(null))
console.log(isNullUndefinedOrEmpty({}))
console.log(isNullUndefinedOrEmpty({'key': 'MyVal'}))
console.log(isNullUndefinedOrEmpty('{}'))
你的选择真的:)
推荐阅读
- python - 两个 Python venv 环境之间的联系在哪里
- android - Google Play 开发者控制台 - 上传密钥密码太弱
- php - 在 Laravel 中上传到服务器之前,我应该配置缓存吗?
- c++ - 如何使用 OpenCv 从图像中“切出”轮廓?
- c++ - 如何以非阻塞方式压缩文件
- jquery - Rails 5 Star Rating jQuery Plugin Raty 仅在表格中以第一种形式显示星
- netsuite - 如何在 fieldChanged 事件上获取 itemtype
- python - 如何在 python 脚本中更改控制面板设置?
- android - 出现错误:java.lang.String 无法转换为 org.json.JSONObject
- python-3.x - 如何在熊猫中学习中继器字段的数量