是否可以在javascript if语句中使用回调函数

时间:2018-05-24 01:54:43

标签: javascript callback

这个代码看起来有点脏,但我只是想知道它是否真的没问题。或者也许应该避免。

        let cb = (valid) => {
            if(valid){
                console.log('hi')
            }
        }
        if(typeof this.validate === "undefined" || this.validate(cb)){
            console.log('hi')
        }

因为日志输出仍然只会触发一次。但也许这种方法不是一个好主意?

1 个答案:

答案 0 :(得分:0)

很好的问题。

根据回调函数的行为,您的问题有2个答案。

首先为什么要回调?回调用于在不同用例下通过同一功能执行不同的操作。获得结果后的示例有时需要显示它,有时需要将其插入数据库。我们的功能工作是获取结果并将其传递给回调函数以进行进一步处理。

现在回答您的问题:

  1. 是的,可以在if条件下使用回调。如果回调是同步函数,则可以。在这种情况下,我们希望函数在不同的情况下传递if条件,例如:

    让两个函数sumOddsumEven都是同步的,如果两个数字的和为奇数,则sumOdd返回两个数字的和,否则返回false/0 sumEven表示两个数字的和。

代码:

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
}

在上面的示例中使用回调是很好的,因为这两个回调都是同步函数,并且节省了为main函数编写两个函数的调用,只是调用了两个不同的函数,其余所有功能都是相同的。

  1. 否,在if条件下不能使用回调,因为如果调用函数是异步函数,并且大多数javascript回调函数正在调用另一个函数来发回,则大多数回调函数都将被使用响应。

    promise,API调用,数据库调用,表达getpost和其他功能的示例,所有调用另一个功能以发回响应。

```

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

```

总而言之,如果回调是同步的并且您的所有代码在if条件下都是同步的,则可以使用。如果存在回调地狱或异步函数,则不会。

建议您避免这种情况,如果维护不当可能会导致callback hell