Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Callback Hell (https://javascript.ru/forum/node-js-io-js/72317-callback-hell.html)

Alexandroppolus 19.02.2018 17:45

Audaxviator,
но по сути обе функции выполнят свой колбэк после всех синхронных действий текущего тика.
Просто process.nextTick оформляет свою задачу как "микротаск" - добавляет в специальную очередь текущего исполняемого "таска" (витка основного событийного цикла), все пункты из очереди выполняются сразу за самим таском, только потом стартует новый таск.
А setImmediate сразу ставит отдельный таск.

Потому, в принципе неважно что там - nextTick, setImmediate, прочее... - все равно присвоение (из примера) случится после тех действий, которые идут за вызовом foo()

Audaxviator 19.02.2018 18:11

Не, ну я пытался показать сам принцип, потому что задрала уже тема "ужаса-ужаса асинхронности", и вопросы типа "а почему оно undefined? а куда делось значение?".
Чего тут такого сверхъестественного?
А модули для Ноды я всё равно писать не буду, поэтому в совсем-совсем тонкости я и не вникаю, в исходные коды не заглядывал. Асинхронность - это весело и изящно.

Aetae 20.02.2018 00:30

Цитата:

Сообщение от Валерия_05 (Сообщение 478518)
А, всё я поняла. Это NodeJS там наверное всё иначе работает.
Извините.

Ставлю рубь против копейки: всё ещё будет. Появится javascript аналог jdbc, разумеется "супер секурный", и будут все тягать базу прям с клиента. И под это дело конечно ещё вагончик кривых технологий подвезут, с прицепом из дырок и атак на отказ в обслуживании.)

Alexandroppolus 20.02.2018 01:19

Цитата:

Сообщение от Aetae
Ставлю рубь против копейки: всё ещё будет. Появится javascript аналог jdbc, разумеется "супер секурный", и будут все тягать базу прям с клиента.

Такое даже иногда бывает, если на сайте нет защиты от sql инъекций (да, бывает и в наши дни). Пишется "пользовательский jdbc" :)

nerv_ 25.02.2018 12:36

Цитата:

Сообщение от Audaxviator (Сообщение 475926)
isRegistered(bla-bla);

async function isRegistered(id) {
  var sel_query = await new Promise( resolve => {
    con.query('SELECT * FROM `users` WHERE `userid`= ?', id, function(error, results) {
      if(err) console.error(err);
      resolve(results);
    });
  }).then( result => {
    return result;
  };
  if(sel_query.length != 0) {
    console.log(1, sel_query);
  } else {
    console.log(0);
  }
}

как бы это вам сказать... Все придумано до нас в данном случае -- https://nodejs.org/dist/latest-v8.x/...isify_original

const {promisify} = reuqire('util')

const query = promisify(con.query)

isRegistered(bla-bla);

async function isRegistered(id) {
  const result = await query('SELECT * FROM `users` WHERE `userid`= ?', id)
  console.log('result', result)
}


Но проще бывает версию драйвера с промисами подключить...
Или еще проще, современные драйвера позволяют использовать оба подхода (коллбеки и промисы). Соответственно, если не передавать коллбек, вернется промис.

Audaxviator 25.02.2018 13:02

Цитата:

Сообщение от nerv_ (Сообщение 479095)
Все придумано до нас в данном случае

Для кого придумано?
Либо для того, кто реально на этом работает - пишет сайты-коды и вот это всё, либо для того - кто сам придумывать не любит или не может.
Ни то, ни другое ко мне не относится.


Часовой пояс GMT +3, время: 13:15.