我有这样的代码:
function doSomething (inputVar, callback) {
// Input variables validation
if (inputVar === 'malformed input') {
callback(new Error('malformed input'))
return // prevent the rest of the function from being executed
}
console.log("You shouldn't see this message when something goes wrong with the validation.")
// do other operations
callback(null)
}
将验证输入变量的代码移动到另一个函数以使doSomething()
看起来更干净,更优雅的最佳方法是什么?
以下代码中的return
不会阻止执行console.log('You shouldn\'t see this message when something goes wrong with the validation.')
。我无法以这种方式包装验证码。
function inputValidation (inputVar, callback) {
if (inputVar === 'malformed input') {
callback(new Error('malformed input'))
return // This line doesn't prevent the rest of the `doSomething` from being executed
}
}
function doSomething (inputVar, callback) {
// Input variables validation
inputValidation(inputVar, callback)
console.log("You shouldn't see this message when something goes wrong with the validation.")
// do other operations
callback(null)
}
答案 0 :(得分:0)
要通过@vlaz通过从验证器返回值来进一步详细说明@vlaz的注释,则可以决定要执行的操作。我不完全知道您的应用程序的结构或功能,但总的来说,我尝试使功能具有一个目的,在这种情况下,验证是确定数据是否有效的过程,调用回调不属于该目的。因此,也许可以执行的重构是:
function isInputValid(inputVar) {
// perform complex validation logic
const isValid = inputVar === 'malformed input'
return isValid
}
function doSomething(inputVar, callback) {
if(!isInputValid(inputVar)) {
callback(new Error('malformed input'))
return
}
console.log("Input valid")
// do other operations
callback(null)
}
doSomething("foobar", msg => {console.log(`logging callback ${msg}`)})
doSomething("malformed input", msg => {console.log(`logging callback ${msg}`)})
对于像这样的简单示例来说,这看起来有点愚蠢,但是当输入验证变得越来越复杂时,您可以将该验证移到一个单独的文件中,并独立于doSomething逻辑来测试验证逻辑。
我还将// do other operations
引用的操作移到另一个函数。同样,这将有助于提高可读性和可测试性。