Javascript, простой пример обратного вызова не работает, как ожидалось - PullRequest
0 голосов
/ 01 мая 2018

Во-первых, большое спасибо всем, кто взглянет на мой вопрос. Это абсолютно просто, но я просто не понимаю. Я просмотрел все учебные пособия, но асинхронные обратные вызовы сводят меня с ума. Большое спасибо за помощь, привет из Германии:)

Если кто-нибудь может сказать мне, почему приведенный ниже код не входит в консоль, как ожидалось. Ожидаемое средство, обратный вызов вызывается после завершения функции Timeout. Вместо этого моя консоль сначала регистрирует обратный вызов? Что я здесь не так делаю?

function doHomework(subject, callback) {
  setTimeout(function () {
   console.log(`Starting my ${subject} homework.`);
  }, 10);
  callback();
}

doHomework('math', function() {
  console.log('Finished my homework');
});

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Проблема в том, что вы выполняете обратный вызов вне вашей функции setTimeout. Javascript выполняет код асинхронно, что означает, что он не ждет, пока предыдущий код будет «завершен», прежде чем он перейдет к следующей строке.

Следовательно, когда вы вызываете doHomework, он запускает таймер и немедленно переходит к следующей строке кода, которая является обратным вызовом. Затем по истечении 10 мс выполняется код внутри тайм-аута. Чтобы получить желаемый результат, вам нужно поместить функцию обратного вызова в функцию setTimeout, например:

function doHomework(subject, callback) {
   setTimeout(function () {
      console.log(`Starting my ${subject} homework.`);
      callback();
   }, 10);
}
0 голосов
/ 01 мая 2018

Вы должны поместить вызов функции обратного вызова в ваш setTimeout

function doHomework(subject, callback) {
  setTimeout(function () {
   console.log(`Starting my ${subject} homework.`);
   callback();
  }, 10);
}
...