Асинхронно вызывая обратные вызовы узлов - PullRequest
0 голосов
/ 04 января 2019

Рассмотрим этот фрагмент кода:

Я вызываю callback из функции dothis.Обратите внимание, что callback в dothis находится внутри timeout

console.log("start");

doThis(":)", callback)

function callback(a) {
      console.log('in callback '+ a)
    }


function doThis(a,cb) {
      setTimeout(() => {
        cb(a)
      }, 2000);

      console.log('in first function') 
    }
console.log("end")

Я получаю следующий результат:

start
in first function
end
in callback :)

Теперь рассмотрим ниже,

Все то же самое, за исключением того, что на этот раз нет timeout:

console.log("start");

doThis(":)", callback)

function callback(a) {
  console.log('in callback '+ a)
}


function doThis(a,cb) {
    cb(a);
 console.log('in first function') 
}
console.log("end")

Я получаю следующий результат:

start
in callback :)
in first function
end
  1. Говорят, что обратный вызов в JavaScript можетвызываться асинхронно или синхронно.Откуда вы знаете, что он вызывается любым из этих способов?
  2. Кажется, timeout показывает ожидаемое асинхронное поведение.Без тайм-аута мой код ведет себя так, будто обратный вызов вызывается синхронно согласно зарегистрированным сообщениям.Мое понимание семантики выполнения до завершения заставляет меня думать, что я всегда должен получать первый результат, независимо от того, сколько времени потребуется для обработки обратного вызова.Насколько я понимаю, JavaScript выполняет текущую активность (код JavaScript) до конца, а любая асинхронная активность (обратный вызов) ставится в очередь (в очереди событий) для последующего выполнения.

В этом случае кажется, что если результат обратного вызова готов, он регистрируется перед следующими сообщениями.Когда оно задерживается, оно регистрируется последним.Это асинхронное поведение?

1 Ответ

0 голосов
/ 04 января 2019

Учитывая этот раздел вашего кода:

console.log("start");

doThis(":)", callback)

function callback(a) {
    console.log('in callback '+ a)
}

function doThis(a,cb) {
    setTimeout(() => {
        cb(a)
      }, 2000);

    console.log('in first function') 
}

console.log("end")

У вас есть doThis, что это функция, которая вызывает функцию обратного вызова внутри, но стек ждет и выполняет вторую функцию после вызова callback(a), возможно, вы ожидаете, что код выполняет все по порядку, но хитрость в том, что стек выполнения вызывает первую функцию (doThis), но ожидает таймера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...