问题描述
为了DRY(不要重复自己)代码的利益,我想知道下面给出的代码是否可以任何方式进行重构。在下面的代码中,如您所见,我在condition1
和condition2
处重复分配语句,因为在每个if语句的末尾,我都会进行不同的函数调用。
websocket.onmessage = async(event) => {
const data = JSON.parse(data)
let infoFromExternalApi1,infoFromExternalApi2,infoFromExternalApi3
// Assignments for infoFromExternalApi variables are repeated due to difference in function calls doSomething() and doSomethingElse()
if (condition1) {
infoFromExternalApi1 = await getInfoFromExternalApi1()
infoFromExternalApi2 = await getInfoFromExternalApi2()
infoFromExternalApi3 = await getInfoFromExternalApi3()
doSomething()
}
if (condition2) {
infoFromExternalApi1 = await getInfoFromExternalApi1()
infoFromExternalApi2 = await getInfoFromExternalApi2()
infoFromExternalApi3 = await getInfoFromExternalApi3()
doSomethingElse()
}
}
解决方法
您可能正在寻找
websocket.onmessage = async(event) => {
const data = JSON.parse(data)
let infoFromExternalApi1,infoFromExternalApi2,infoFromExternalApi3
if (condition1 || condition2) {
infoFromExternalApi1 = await getInfoFromExternalApi1()
infoFromExternalApi2 = await getInfoFromExternalApi2()
infoFromExternalApi3 = await getInfoFromExternalApi3()
}
if (condition1) {
doSomething()
}
if (condition2) {
doSomethingElse()
}
}
当然,如果两个条件都成立,则这与原始代码的工作原理有所不同,即仅从外部api获取一次信息。