пишу на node.js как привыкнуть к асинхронности? еще смущает обработка ошибок еще нужно ведь постоянно помнить какие вернуть в коллбек параметры например функция проверки Код (Javascript): function checkOffer(offer, done) { if ( offer.itemsToGive.length !== 0 || offer.itemsToReceive.every(item => { return config.steam.allowedKeys.includes(item.name); }) ) { return done(null, false); } userExist(offer, (err, exist) => { if (!err) { return done(null, exist); } else { return done(null, false); } }); } function userExist(steamId, done) { conn.query('SELECT COUNT(id_user) as count FROM `user` WHERE ?', [{steam_id: steamId}], (err, result) => { if (!err) { return done(null, result.count > 0); } else { return done(err, false); } }); } может надо на событиях делать?
https://learn.javascript.ru/promise https://learn.javascript.ru/generator https://habrahabr.ru/post/282477/
нет. userExist() будет выполняться асинхронно от внешнего кода, и займет какое-то время. поэтому возвращать нужно промис. а уже когда данные будут получены,сработает resolve, и с данными можно будет работать, в .then() например
почитал про промисы, в целом конечно удобнее но непривычно например если переписать мой код Код (Javascript): function checkOffer(offer) { return new Promise((resolve) => { if ( offer.itemsToGive.length === 0 && offer.itemsToReceive.every(item => { return config.steam.allowedKeys.includes(item.name); }) ) { resolve(offer); } else { throw new Error('[!] not valid offer'); } }); } function getSteamId(offer) { if (isNaN(offer.message) || offer.message.charAt(0) != '7') { return null; } return offer.message; } function checkUser(offer) { return new Promise((resolve) => { const steamId = getSteamId(offer); if (steamId === null) { throw new Error('[!] user not found'); } conn.query('SELECT COUNT(id_user) as count FROM `user` WHERE ?', [{steam_id: steamId}], (err, result) => { if (err) { throw err; } else if (result.count > 0) { resolve(offer); } else { throw new Error('[!] user not found'); } }); }); checkOffer(offer) .then(offer => { return checkUser(offer); }) .then(offer => { return acceptOffer(offer); }) .then(offer => { return addMoneyToUser(offer); }) .catch(error => { console.log('[!] трейд отклонен'); console.log(error.message); offer.decline(); }); } что смущает ф-я checkUser если юзер не найден то надо кидать reject или исключение плюс жонглировать нужно offer например я не могу передать userid в checkUser потому что дальше нужен опять offer, или передавать 2 параметра