需要澄清回调如何在javascript中工作

时间:2014-02-21 13:47:14

标签: 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函数时重命名为“data”参数。

有人可以提供这个回调和tempretures数组关系的更容易理解的版本吗?感谢。

3 个答案:

答案 0 :(得分: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));
});

答案 1 :(得分: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));
    });
});

答案 2 :(得分:0)

  

所以,回调只是另一个函数,我们正在创建它   一个方法?并为其分配一个tempretures数组?

有点,回调是一个函数,但你没有创建一个方法。你正在调用一个方法并将数组分配给它。

  

这部分让我很困惑。如果回调中的“数据”是一种方法   为什么我不能将它重命名为其他任何东西?

错误......“数据”不是方法,它是单个元素对象数组。只要您在回调方法中更改名称,就可以将其命名为任何名称...例如:

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

虽然我可以重命名为任何我想要的“数据”参数   调用getData函数。

你关心调用getData因为for循环在那个函数中。您将callback方法作为该函数中的参数传递,以便在计算数据后对其进行处理。