2014-02-21 2 views
0

У меня трудно понять, как называется этот обратный вызов:нужны разъяснения о том, как обратные вызовы работают в JavaScript

$(function() { 
     function getData(callback) { 
      var now = Date.now(); 
      var hour = 60 * 60 * 1000; 
      var temperatures = []; 
      for (var k = 24; k > 0; --k) { 
       temperatures.push([now - k * hour, 
        Math.random() * 2 + 10 * Math.pow((k - 12)/12, 2) 
       ]); 

       } 
      callback ({data: temperatures }); 
     } 

     getData(function (data) { 
      $.plot("#chart", new Array(data)); 
     }); 
    }); 

Я хорошо знаю, что происходит в цикле только нуждаются в уточнении с обратного вызова. Итак, обратный вызов - это еще одна функция, и в ней мы создаем метод? И присвоить массив tempretures? Эта часть меня действительно смущает. Если «данные» в обратном вызове - это метод, почему я не могу переименовать его ни в чем другом? Хотя я могу переименовать во что угодно, я хочу аргумент «data», когда я вызываю функцию getData.

Может ли кто-нибудь предоставить более понятную версию этого отношения обратного вызова и tempretures? Благодарю.

+0

Данные в обратном вызове являются аргументом. Функция обратного вызова является анонимной. – robertc

+0

Функция в getData принимает объект и возвращает ему переменную «data». В обратном вызове вы передаете этот объект - {data: temperature}, вы путаете метод данных здесь с переменной данных в функции getData. Первый - это метод объекта, второй - имя для ссылки на этот объект. –

ответ

3

Вы создаете объект, который имеет одно свойство, называемое data значение которого является массивом (ваша температура) , Этот объект передается как первый параметр обратного вызова.

getData(function (data) { 
    $.plot("#chart", new Array(data)); 
}); 

Здесь объект передается в качестве аргумента называется data. Как написано, я не думаю, что это сработает, так как вам нужно пройти в массиве до new Array(), а не в качестве объекта. Так что это:

getData(function (data) { 
    $.plot("#chart", new Array(data.data)); 
}); 

Это немного легче понять, если переименовать свойство объекта:

callback ({temperatures: temperatures}); 

getData(function (data) { 
    $.plot("#chart", new Array(data.temperatures)); 
}); 
+0

Я бы не стал предполагать, что код не будет работать. По мере того как код стоит, метод plot вызывается с помощью массива объектов с одним элементом. Может быть, это метод построения диаграммы и может обрабатывать несколько строк данных. Но в этом случае необходима только одна строка данных. – Smeegs

+0

Это было действительно полезно, и оно работает так же. Благодаря! – funguy

+0

Если это Флот, который использует OP, то вторым аргументом является 'data', который [" представляет собой массив рядов данных "] (https://github.com/flot/flot/blob/master/API.md# формат данных). – Andy

0

Обратный вызов - это способ сказать: «Когда вы закончите с тем, что делаете, вызовите этот метод».

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

В случае вашего кода, я аннотацию, как я прохожу:

$(function() { 
    function getData(callback) { //callback is a parameter, in our case a function to  be called later 

     var now = Date.now(); 
     var hour = 60 * 60 * 1000; 
     var temperatures = []; 
     for (var k = 24; k > 0; --k) { 
      temperatures.push([now - k * hour, 
       Math.random() * 2 + 10 * Math.pow((k - 12)/12, 2) 
      ]); 

      } 
     callback ({data: temperatures }); //once you've calculated temperature, call the callback method with an object that has a property called 'data' and a value that is an array. 
    } 

    getData(function (data) { 
     $.plot("#chart", new Array(data)); 
    }); 
}); 
0

Таким образом, обратный вызов только одна функция, и в нем мы создаем в метод? И присвоить массив tempretures?

Kinda, обратный вызов является функцией, но вы не создаете метод. Вы вызываете метод и назначаете ему массив.

Эта часть меня действительно смущает. Если «данные» в обратном вызове - это метод , почему я не могу переименовать его ни в чем другом?

Неверный ... «данные» - это не метод, это массив объектов с одним элементом. А вы можете назвать это все, что вы хотите, до тех пор, как вы измените имя в методе обратного вызова ... например:

getData(function (newData) { 
     $.plot("#chart", new Array(newData)); 
    }); 

В то время как я могу переименовать все, что я хочу, чтобы «данные» аргумент, когда я am вызов функция getData.

Вы заботитесь о вызове getData, потому что цикл for находится в этой функции. Вы передаете метод callback в качестве параметра этой функции для обработки данных после его вычисления.

Смежные вопросы