2014-02-21 82 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數組?這部分讓我很困惑。如果回調中的「數據」是一種方法,爲什麼我不能將它重命名爲其他任何東西?雖然我可以重新命名爲任何我想調用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

如果這是Flot 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數組?

有點兒,回調是一個函數,但你並沒有創建一個方法。你正在調用一個方法並將數組賦值給它。

這部分讓我很困惑。如果回調中的「數據」是方法 爲什麼我不能將它重命名爲其他任何東西?

錯誤......「data」不是一個方法,它是一個單一的元素對象數組。你可以命名爲任何你想要的,只要你在回調方法變更名稱...例如:

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

雖然我可以重命名爲任何我想要的「數據」的說法時,我我調用了getData函數,調用了 。

由於for循環在該函數中,因此您在意getData。您正在傳遞callback方法作爲該函數中的一個參數來處理計算後的數據。