Рефакторинг этой функции для последовательного использования return - PullRequest
0 голосов
/ 14 января 2019

У меня есть функция JS, для которой я получаю ошибку eslint, так как Refactor эта функция, чтобы последовательно использовать «return». Но, похоже, я всегда возвращаюсь. Кто-нибудь может подсказать, как я могу решить эту проблему?

function filterBooks(books, context, purpose, callback) {
    if (!context && !purpose) {
        logger.warn("context and purpose not found so ingnoring the filtering on context and purpose");
        return callback(null, books);
    } else {
        if (purpose) {
            filterBooksByPurpose(books, purpose);
        }
        if (context) {
                filterBooksByContext(books, context,function(err,books){
                if(err){
                    return callback(err, null);
                }else{
                    books = removebooksEmptyPages(books);
                    return callback(null, books);
                }
            });
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

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

Если filterBooks является синхронным, он должен либо последовательно возвращать результат, либо предоставлять побочные эффекты (изменить books) без возврата. Если filterBooks асинхронный, он не может вернуть результат синхронно.

callback - обратный вызов в стиле Node-style-first-error. Они обычно используются в асинхронном коде, и асинхронная функция не может возвращать значение из асинхронно вызванного обратного вызова.

filterBooks представляется синхронным, поэтому использование обратных вызовов неоправданно.

Если в настоящее время используется как:

filterBooks(..., (err, result) => {
  if (err)
    console.error(err);
  else
    console.log(result);
});

Может быть переработан для использования как:

try {
    const result = filterBooks(...);
    console.log(result);
} catch (err) {
    console.error(err);
}

Так же могут использоваться другие функции, такие как filterBooksByContext.

0 голосов
/ 14 января 2019

Блок else не имеет никакого возвращаемого значения, но блок if имеет, поэтому Линтер жалуется. Комментарий в блоке кода ниже

function filterBooks(books, context, purpose, callback) {
    if (!context && !purpose) {
        logger.warn("context and purpose not found so ingnoring the filtering on context and purpose");
        return callback(null, books);
    } else {
        // *********** no return value in this block
        if (purpose) {
            filterBooksByPurpose(books, purpose);
        }
        if (context) {
                // there is no return here as well, the callback function has return value but not for filterBooks
                filterBooksByContext(books, context,function(err,books){
                if(err){
                    return callback(err, null);
                }else{
                    books = removebooksEmptyPages(books);
                    return callback(null, books);
                }
            });
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...