Это нормально, чтобы иметь функцию обратного вызова в выражении if JavaScript - PullRequest
0 голосов
/ 24 мая 2018

Этот код может показаться немного грязным, но мне просто интересно, все ли в порядке.Или, возможно, этого следует избегать.

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

, потому что вывод журнала будет срабатывать только один раз.Но может быть, этот метод не очень хорошая идея?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Хороший вопрос.

Есть 2 ответа на ваш вопрос, в зависимости от поведения функции обратного вызова.

Во-первых, почему обратные вызовы?Обратные вызовы используются для выполнения различных операций одной и той же функцией в разных случаях использования.Пример после получения результата иногда нужно его отобразить, иногда нужно вставить его в базу данных.Наша функция заключается в том, чтобы просто получить результат и передать его в функцию обратного вызова для дальнейшего процесса.

Теперь ответьте на свой вопрос:

  1. Да, можно использовать обратный вызовв if состоянии.Это нормально, если обратный вызов является синхронной функцией.Как и при этом условии, мы хотим, чтобы наша функция передавала условие if при различных обстоятельствах, например:

    Пусть две функции sumOdd и sumEven, обе эти функции являются синхронными и 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просто для вызова 2 разных функций и отдыха все функции одинаковы.

Нет, использование обратного вызова в условиях if неприемлемо, так как большинство функций обратного вызова используются, если вызывающая функция является асинхронной функцией, и большинство функций обратного вызова javascript вызывают другую функцию для отправки обратного ответа.

Пример обещания, вызовов API, вызовов базы данных, экспресс get, post и других функций, все вызывает другую функцию для отправки ответа.

```

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, если не поддерживается должным образом.

0 голосов
/ 24 мая 2018

Вы можете сократить условие до:

if(!this.validate || this.validate(cb)) { 
    // ...
}

Поскольку ваш вопрос касается стиля / общепринятых практик в JavaScript, это не считается плохим кодом.Это, конечно, субъективно, но это не редкость, и оно выполняет предназначенную функцию, не слишком запутанно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...