Callback () Узел Js

5

Я очень смущен этой программой. Я купил книгу под названием "Node JS, MongoDB и AngularJS Web Development" Брэда Дейли. Я нашел программу, чтобы продемонстрировать что-то, называемое закрытием, и показывает эту программу в качестве примера. Это только первая часть программы.

function logCar(logMsg, callback){
    process.nextTick(function(){
        callback(logMsg);
    });
}

var cars = ["Ferrari", "Porsche", "Bugatti"];

for(var idx in cars){
    var message = "Saw a " + cars[idx];
    logCar(message, function(){
        console.log("Normal Callback: " + message);
    })
}

Я пытался выяснить, как эта программа функционирует целый час, но я не могу понять, какова функция обратного вызова (logMsg).

Я знаю, что это, вероятно, очень простой вопрос, но я просто не могу обернуть вокруг него голову.

2 ответа

2
Лучший ответ

callback - это любая функция, которую вы передаете logCar(). Когда logCar завершает выполнение того, что он должен делать, он вызывает функцию обратного вызова. Внутри цикла for вы вызываете logCar() следующим образом.

logCar(message, function(){
    console.log("Normal Callback: " + message);
})

Здесь функция() {..} - это функция обратного вызова, и она будет вызываться после выполнения logCar. В этом случае функция обратного вызова, которую вы предоставили, будет console.log сообщением, которое вы передали в качестве первого параметра. Вы могли бы передать еще одну функцию, которая будет выполнять что-то другое в качестве обратного вызова.

  • 0
    Почему обратный вызов (logMsg) передает переменную logMsg? Там нет ничего в параметрах анонимной функции, чтобы держать его.
  • 0
    Но вы определили свою функцию обратного вызова, чтобы принимать все, что передано в качестве первого параметра в функции logCar . Таким образом, любая функция, которую вы передаете в качестве обратного вызова, автоматически принимает переменную logMsg.
Показать ещё 7 комментариев
2

Я нахожу, что проще обернуть голову, следуя пути выполнения более подробно, особенно путь, который принимает logMsg. Хороший отладчик отлично подходит для этого.

Ничего не происходит до тех пор, пока в цикле, где определена переменная с именем message. В начале это будет "Пила Ferrari".

Там также анонимная функция рядом с "сообщением", которую, к сожалению, сложно отделить и определить. Поскольку он выходит за пределы своей области для переменной с именем "сообщение", которая попадает внутрь этого цикла, мы не могли бы сделать в строке 6:

var someFunction = function(){
      console.log("Normal Callback: " + message);
}

... потому что какое "сообщение"? Ничто вне этого цикла for-loop не имеет прямого доступа к "сообщению" (кроме закрытия, но пока об этом не беспокойтесь). Обратите внимание, что эта функция еще не будет выполнена. Это только что было создано в этот момент.

Итак, следующий выполняется LogCar("Saw a Ferrari", someFunction...). Где LogCar? О, верх. Пусть прыгнет туда, но для простоты пусть пропускает process.nextTick. По существу someFunction("Saw a Ferrari") происходит здесь. Где SomeFunction? О, эта анонимная функция, которая еще не выполнена. Пришло время его выполнить. Таким образом, процесс перескакивает назад, чтобы увидеть, что внутри него и выполнить его, что есть console.log("Saw a Ferrari");

Это сделано, и процесс повторяется для "Saw a Porsche".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню