在javascript if语句中使用回调函数可以吗
这段代码看起来有点脏,但我只是想知道它是否真的可以。或者应该避免在javascript if语句中使用回调函数可以吗,javascript,callback,Javascript,Callback,这段代码看起来有点脏,但我只是想知道它是否真的可以。或者应该避免 let cb = (valid) => { if(valid){ console.log('hi') } } if(typeof this.validate === "undefined" || this.validate(cb)){ console.log('hi')
let cb = (valid) => {
if(valid){
console.log('hi')
}
}
if(typeof this.validate === "undefined" || this.validate(cb)){
console.log('hi')
}
因为日志输出仍然只触发一次。但这种方法可能不是个好主意?您可以将条件缩短为:
if(!this.validate || this.validate(cb)) {
// ...
}
因为您的问题是关于JavaScript的风格/普遍接受的实践,所以这并不被认为是坏代码。这当然是主观的,但这并不少见,它实现了预期的功能而不会太令人困惑。好问题
根据回调函数的行为,您的问题有两个答案
首先,为什么要回调?回调用于在不同的用例下由相同的函数执行不同的操作。示例在获得结果后,有时需要显示它,有时需要将其插入数据库。我们的函数工作就是得到结果并将其传递给回调函数进行进一步处理
现在回答你的问题:
条件下使用callback。如果回调函数是一个同步函数,这是可以的。在这种情况下,我们希望函数在不同情况下通过if
条件,例如:
让两个函数sumOdd
和sum偶
,这两个函数都是同步的,sumOdd
如果两个数的和为奇数,则返回两个数的和,否则返回false/0
,类似地,对于两个数的偶数和,返回sumOddle
main
函数编写两个函数,就可以调用两个不同的函数,其余所有功能都是相同的
if
条件下使用回调是不合适的,因为大多数回调函数都是在调用异步函数的情况下使用的,并且大多数javascript回调函数都是调用另一个函数以发送回响应
示例promise、API调用、数据库调用、expressget
、post
和其他函数,所有这些函数都调用另一个函数以发送回响应if
条件下都是同步的,那么就可以使用if。如果存在回调地狱或异步函数的情况,则不会
建议您避免出现这样的情况,如果维护不当,可能会导致
回调地狱。只要所说的,如果条件不太长,似乎就很好了,尽管这个例子似乎有点小,有点做作(您有更丑陋的例子吗?)可能更适合代码评审though@CertainPerformance对于CR来说可能太小了一点,所以它实际上不适合任何SE站点。如果(!this.validate | | this.validate(cb)){…}
让我们同意,如果他已经使用了typeof
,他至少可以检查!==“函数”
。是否!这个.validate
就足够了,这取决于其他因素。
function sumOdd(a,b) {
if ( (a+b)%2 === 0 || typeof a !== 'number' || typeof b !== 'number') return false;
return a+b;
}
function sumEven(a,b) {
if ( (a+b)%2 !== 0 || typeof a !== 'number' || typeof b !== 'number') return false;
return a+b;
}
function main(cb) {
// let x, y be two random generated numbers of input from user
let x, y;
// after some operation let main call callback function
// main function don't care about what callback function do just its working is over.
return cb(x, y);
}
// Depending upon our requirement if we want to check for odd sum pass sumOdd as callback
if ( main(sumOdd) ) {
// This works for odd sum
}
if ( main(sumEven) ) {
// This works for even sum
}
new Promise ( (resolve, reject) => {
resolve('something'); // This is again calling a function
reject('something'); // Reject is also a function
});
app.get('/api', (req, res) => {
res.send('something') // res.send, res.json, res.end, res.write are all functions to send back response.
});