首页 > 解决方案 > 最小化 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;
}

标签: javascriptnode.js

解决方案


我会做一些我可以调用的辅助函数。也许是某种帮助类。

否则我会停止将后续的 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('{}'))

你的选择真的:)


推荐阅读