Асинхронный вызов функций

273
13 мая 2017, 20:29

Здравствуйте. Изучаю JS и NodeJS.

Когда нужно возвращать значения через колбек, а когда через return?

Рассмотрим пример:

function save(user, cb) {
if (!user) {
    throw new Error('user не передан');
}
if (typeof user !== 'object' || user === null) {
    throw new Error('user должен быть объектом');
}
if (!cb) {
    throw new Error('колбек не передан');
}
if (typeof cb !== 'function') {
    throw new Error('колбек должен быть функцией');
}
validate(user, function(err, user) {
    if (err) {
        return cb(err);
    }
    prepare(user, function(err, user) {
        if (err) {
            return cb(err);
        }
        insert(user, function(err, id) {
            if (err) {
                return cb(err);
            }
            return cb(null, id);
        });
    });
});
}

Эта функция сохраняет документ user в бд. Алгоритм работы:

  • Проверка аргументов
  • Валидация свойств аргумента user - validate
  • Добавление недостающих свойств, хеширование пароля - prepare
  • Вставка документа в БД.

Как видно, каждая функция получает колбек, который вызывает по окончанию своей работы. В колбеке передается ошибка, либо данные.

Вопрос: я не могу понять когда мне нужно использовать обратный вызов, а когда можно просто возвращать значения через оператор return?

Дополнительно пример реализации функции prepare:

/**
* Добавляет необходимые поля
*/
function prepare(user, cb) {
user.initials = (user.firstName[0] + user.lastName[0]).toUpperCase();
user.project = [];
user.dialogs = [];
user.locked = false;
encryptPassword(user.password, function(hashedPassword) {
    user.hashedPassword = hashedPassword;
    delete user.password;
    cb(null, user);
});
}
/**
* Хеширует пароль
*/
function encryptPassword(password, cb) {
const salt = Math.random() + '';
const hashedPassword = crypto.createHmac('sha1', salt).update(password).digest('hex');
cb(hashedPassword);
}
READ ALSO
onscrollbottom и onscrolltop

onscrollbottom и onscrolltop

Мне нужно так чтобы если скролят вверх выполнялась одна функция а при скролле вниз, другаяЕсть ли такое событие?

243
Как получить id формы при клике на дочерний элемент с классом (id у формы уникально)

Как получить id формы при клике на дочерний элемент с классом (id у формы уникально)

При клике на кнопку с классом remove нужно получить id формы, в которой находится именно эта кнопкаВот код с двумя формами (Две одинаковые формы...

257
JS / React / Redux / setTimeout () usage

JS / React / Redux / setTimeout () usage

Функция updateList вызывается каждый раз при изменении поля input, получая event в качестве аргументаКак сбросить интервал запроса reqFn внутри updateList,...

280