@vetsmen

Async/await и правильность codestye?

Доброго времени суток. Есть данный код:
const createUser = async (username, userid, auth_type, img) => {
	try {
		let isRegister = await connection.query('SELECT username, userid, img FROM Users WHERE userids = ?', [userid]);

		let query = (isRegister && isRegister[0] && (isRegister[0].username !== username || isRegister[0].img !== img)) ?
			await connection.query('UPDATE Users SET ? WHERE userid = ?', [{username, img}, userid]) :
			await connection.query('INSERT INTO Users SET ?', {username, userid, auth_type, img});
			
		return true;
	} catch(error) {
		console.log(error);
		return false;
	}
};

if(createUser(123, 123, 1, 123)) {
	console.log(1);
} else {
	console.log(2);
}


Адекватный ли codestyle у функции createUser? И чтобы работала функция с console.log(1/2), мне нужно обернуть createUser в промис?
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
Первое что бросается в глаза — использованы пробелы вместо табов, это быдлокодерство (почему — гуглить по запросу "Tab indent space alignment"). Также после if нужен пробел.

if (createUser(123, 123, 1, 123)) писать бессмысленно, т. к. функция createUser() всегда сразу же возвращает промис ещё до начала фактического выполнения функции. Только потом спустя функция начнёт выполняться, и в тот момент, когда выполнение дойдёт до return или throw, функция заполнит этот промис результатом или ошибкой. Т. е. суть в том, что async-функция — это функция, возвращающая промис. Раньше вам приходилось самому возвращать промис, а теперь функция возвращает его за вас. (PS. В реальности, если вдаваться в подробности, то на самом деле функция начнёт выполняться сразу же до первого await, но даже если await'ов не будет, возвращён будет всё-равно промис).

Чтобы решить проблему, нужно либо написать createUser(123, 123, 1, 123).then(bool => { ... }), либо обернуть вызов функции в другую async-функцию, чтобы была возможность использовать await. Конечно же, такая обёртка тоже вернёт промис.

Также нужно отметить, что try catch писать необязательно, вместо этого можно отловить ошибку прямо в указанной выше обёртке (или с помощью .then(value => {}, err => {})). Т. е. отловить ошибку рано или поздно придётся, но необязательно это делать в каждой функции — чаще всего достаточно один раз в конце.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы