За последние 24 часа нас посетили 16783 программиста и 1644 робота. Сейчас ищут 1174 программиста ...

асинхронное программирование

Тема в разделе "JavaScript и AJAX", создана пользователем vikrorpert, 5 янв 2018.

  1. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    пишу на node.js
    как привыкнуть к асинхронности? еще смущает обработка ошибок
    еще нужно ведь постоянно помнить какие вернуть в коллбек параметры
    например функция проверки
    Код (Javascript):
    1. function checkOffer(offer, done) {
    2.  
    3.     if (
    4.         offer.itemsToGive.length !== 0 ||
    5.         offer.itemsToReceive.every(item => {
    6.             return config.steam.allowedKeys.includes(item.name);
    7.         })  
    8.     ) {
    9.         return done(null, false);
    10.     }
    11.  
    12.     userExist(offer, (err, exist) => {
    13.         if (!err) {
    14.             return done(null, exist);
    15.         } else {
    16.             return done(null, false);
    17.         }
    18.     });
    19. }
    20.  
    21. function userExist(steamId, done) {
    22.  
    23.     conn.query('SELECT COUNT(id_user) as count FROM `user` WHERE ?', [{steam_id: steamId}], (err, result) => {
    24.         if (!err) {
    25.             return done(null, result.count > 0);
    26.         } else {
    27.             return done(err, false);
    28.         }
    29.     });
    30. }
    может надо на событиях делать?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    тренируйся, читай лучшие практики, асинхронные алгоритмы могут пригодиться
     
  3. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    если рассмотреть код который я привел как пример то он нормально выглядит?
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    нет.
    userExist() будет выполняться асинхронно от внешнего кода, и займет какое-то время.
    поэтому возвращать нужно промис.
    а уже когда данные будут получены,сработает resolve, и с данными можно будет работать, в .then() например
     
    vikrorpert нравится это.
  6. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    почитал про промисы, в целом конечно удобнее но непривычно
    например если переписать мой код
    Код (Javascript):
    1. function checkOffer(offer) {
    2.  
    3.     return new Promise((resolve) => {
    4.         if (
    5.             offer.itemsToGive.length === 0 &&
    6.             offer.itemsToReceive.every(item => {
    7.                 return config.steam.allowedKeys.includes(item.name);
    8.             })
    9.         ) {
    10.             resolve(offer);
    11.         } else {
    12.             throw new Error('[!] not valid offer');
    13.         }
    14.     });
    15. }
    16.  
    17. function getSteamId(offer) {
    18.  
    19.     if (isNaN(offer.message) || offer.message.charAt(0) != '7') {
    20.         return null;
    21.     }
    22.  
    23.     return offer.message;
    24. }
    25.  
    26. function checkUser(offer) {
    27.  
    28.     return new Promise((resolve) => {
    29.  
    30.         const steamId = getSteamId(offer);
    31.  
    32.         if (steamId === null) {
    33.             throw new Error('[!] user not found');
    34.         }
    35.  
    36.         conn.query('SELECT COUNT(id_user) as count FROM `user` WHERE ?', [{steam_id: steamId}], (err, result) => {
    37.             if (err) {
    38.                 throw err;
    39.             } else if (result.count > 0) {
    40.                 resolve(offer);
    41.             } else {
    42.                 throw new Error('[!] user not found');
    43.             }
    44.  
    45.         });
    46.  
    47.     });
    48.  
    49.  
    50.  
    51. checkOffer(offer)
    52.   .then(offer => {
    53.   return checkUser(offer);
    54.   })
    55.   .then(offer => {
    56.   return acceptOffer(offer);
    57.   })
    58.   .then(offer => {
    59.   return addMoneyToUser(offer);
    60.   })
    61.   .catch(error => {
    62.   console.log('[!] трейд отклонен');
    63.   console.log(error.message);
    64.   offer.decline();
    65.   });
    66.  
    67. }
    что смущает
    ф-я checkUser если юзер не найден то надо кидать reject или исключение
    плюс жонглировать нужно offer
    например я не могу передать userid в checkUser потому что дальше нужен опять offer, или передавать 2 параметра