简体   繁体   中英

Minimize if statement to maintain readability in javascript

I've been writing a system that handles my responses received via an API, however it seems that my whole get function has become very messy & unmanageable?

What's the correct way to handle such statements instead of multiple if checks?

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;
}

I would make some helper functions that I could call. Some sort of helper class maybe.

otherwise I would stop nesting your subsequent if statements inside else statements and let the code read naturally from top to bottom. So such that

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;
}

.
.
.

If you want to write a function that checks if a variable has any value you can make a helper function that looks something like this:

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
}

That way you can now call:

if(isNullUndefinedOrEmpty(solution)) {
    // Value was evaluated as empty - handle error here and return
}

Snippet for demonstrating the helper function

 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('{}'))

Your choice really:)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM