簡體   English   中英

最小化 if 語句以保持 javascript 中的可讀性

[英]Minimize if statement to maintain readability in 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;
}

我會做一些我可以調用的輔助函數。 某種幫手 class 可能。

否則我會停止將后續的 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 來檢查變量是否有任何值,你可以創建一個看起來像這樣的幫助器 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
}

這樣你現在可以調用:

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

用於演示幫助程序 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('{}'))

你的選擇真的:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM