为什么javascript回调函数不执行?

为什么javascript回调函数不执行?,javascript,jquery,json,Javascript,Jquery,Json,有人能解释为什么loadData(符号)之后的回调函数没有被调用吗?我有这个功能: function plotChart(symbol) { alert("symbol: " + symbol); var data = loadData(symbol, function(){ console.log("data: ",data); }); } 我希望log.conso

有人能解释为什么loadData(符号)之后的回调函数没有被调用吗?我有这个功能:

    function plotChart(symbol) {
        alert("symbol: " + symbol);
        var data = loadData(symbol, function(){
            console.log("data: ",data);
        });
    }
我希望
log.console
loadData
完成后执行,但没有任何输出

如果有必要,这里是loadData函数

    function loadData(symbol) {
    count = 0;
    quotes = [];
    $.getJSON("http://localhost:8080/springboot-crud-rest/api/v1/quotes-between?symbol=IBM&startDate=2020-01-01&endDate=2020-09-30", function(data) {
        data.forEach(function(item){
            var quote = {};
            quote.date   = item.id.date.substring(0,10);
            quote.open   = item.open;
            quote.high   = item.high;
            quote.low    = item.low;
            quote.close  = item.close;
            quote.volume = item.volume;
            quotes.push(quote); //put quote in array
        });
        console.log("quotes: ",quotes);  
        return quotes;
    });
}
这里,console.log成功地正确打印出引号

编辑: 根据@Aluan,我将代码更改为如下所示:

    function plotChart(symbol) {
        loadData(symbol).then(function(data) {
            console.log("data: ", data);
        });
    }

    function loadData(symbol) {
        quotes = [];
        $.getJSON("http://localhost:8080/springboot-crud-rest/api/v1/quotes-between?symbol=" +symbol +"&startDate=2020-01-01&endDate=2020-09-30") 
            .then(function (data) {
            const quotes = data.map(function(item) {
                return {
                    date: item.id.date.substring(0,10),
                    open: item.open,
                    high: item.high,
                    low : item.low,
                    close: item.close,
                    volume: item.volume
                };
            });
            console.log("quotes: ",quotes);  
            return quotes;
        });
    }
但现在我发现了一个错误: 未捕获的TypeError:无法读取未定义的属性“then” at plotChart(moneymachine.html:120) 在HTMLTableRowElement


第120行是加载数据(符号)。然后(函数(数据){

加载数据的定义对于理解原因至关重要

给定

我们可以看到,它定义了一个参数,
symbol
。在调用它时,您可以传递其他参数,但它显然没有使用它们

当你写作时

var data = loadData(symbol, function () {
    console.log("data: ", data);
});
第二个论点被完全忽略了

下面是一个
loadData
的示例,它将接受并使用第二个参数,即回调

function loadData(symbol, callback) {
    count = 0;
    quotes = [];
    $.getJSON("http://localhost:8080/springboot-crud-rest/api/v1/quotes-between?symbol=IBM&startDate=2020-01-01&endDate=2020-09-30", function(data) {
        data.forEach(function(item){
            var quote = {};
            quote.date   = item.id.date.substring(0, 10);
            quote.open   = item.open;
            quote.high   = item.high;
            quote.low    = item.low;
            quote.close  = item.close;
            quote.volume = item.volume;
            quotes.push(quote); //put quote in array
        });
        callback(data) // here
        console.log("quotes: ", quotes);  
    });
}
但是,
loadData
的这个定义充其量是次优的。它应该利用jQuery的
$.getJson
的表返回,以使代码更清晰

function loadData(symbol) {
    return $.getJSON("http://localhost:8080/springboot-crud-rest/api/v1/quotes-between?symbol=IBM&startDate=2020-01-01&endDate=2020-09-30")
        .then(function (data) {
            const quotes = data.map(function (item) {
                return {
                    date: item.id.date.substring(0, 10),
                    ...item
                };
            });
            console.log("quotes: ", quotes);
            return quotes;
        });
}
消费为

loadData('something').then(function (data) {
    console.log("data: ", data);
});

loadData
的定义对于理解原因至关重要

给定

我们可以看到,它定义了一个参数,
symbol
。在调用它时,您可以传递其他参数,但它显然没有使用它们

当你写作时

var data = loadData(symbol, function () {
    console.log("data: ", data);
});
第二个论点被完全忽略了

下面是一个
loadData
的示例,它将接受并使用第二个参数,即回调

function loadData(symbol, callback) {
    count = 0;
    quotes = [];
    $.getJSON("http://localhost:8080/springboot-crud-rest/api/v1/quotes-between?symbol=IBM&startDate=2020-01-01&endDate=2020-09-30", function(data) {
        data.forEach(function(item){
            var quote = {};
            quote.date   = item.id.date.substring(0, 10);
            quote.open   = item.open;
            quote.high   = item.high;
            quote.low    = item.low;
            quote.close  = item.close;
            quote.volume = item.volume;
            quotes.push(quote); //put quote in array
        });
        callback(data) // here
        console.log("quotes: ", quotes);  
    });
}
但是,
loadData
的这个定义充其量是次优的。它应该利用jQuery的
$.getJson
的表返回,以使代码更清晰

function loadData(symbol) {
    return $.getJSON("http://localhost:8080/springboot-crud-rest/api/v1/quotes-between?symbol=IBM&startDate=2020-01-01&endDate=2020-09-30")
        .then(function (data) {
            const quotes = data.map(function (item) {
                return {
                    date: item.id.date.substring(0, 10),
                    ...item
                };
            });
            console.log("quotes: ", quotes);
            return quotes;
        });
}
消费为

loadData('something').then(function (data) {
    console.log("data: ", data);
});

我知道symbol参数现在还没有被使用。但是你是说因为没有使用它,回调函数被忽略了吗?我没有发现深度缩进的代码可以让它更清晰。对我来说正好相反。我也不明白什么是回调(数据)是的,或者为什么需要它。但是我会尝试一下。谢谢你,Aluan!我在原始帖子的编辑中更新了我的代码,使其看起来像你的代码,但现在遇到了一个新问题。我无法让你的第二个示例正常工作,但我确实让第一个示例正常工作了。我现在更明白了。我正在将函数作为参数传递,但未能调用that函数。我原以为这会自动发生。只有当你说callback(数据)时,我说callback(引号)。成功了。@user3217883我检查了你的编辑问题。当你复制第二个版本时,你错过了一些东西。你忘记了返回。这就是它失败的原因。啊,好吧,我现在明白了。无论如何,我保留了第一个版本。第二个版本对我来说太难理解了。我知道符号参数现在没有被使用。但是你是说因为它没有被使用,回调函数被忽略了?我没有发现深度缩进的代码可以让它更清晰。我正好相反。我也不明白回调(数据)是什么是的,或者为什么需要它。但是我会尝试一下。谢谢你,Aluan!我在原始帖子的编辑中更新了我的代码,使其看起来像你的代码,但现在遇到了一个新问题。我无法让你的第二个示例正常工作,但我确实让第一个示例正常工作了。我现在更明白了。我正在将函数作为参数传递,但未能调用that函数。我原以为这会自动发生。只有当你说callback(数据)时,我说callback(引号)。成功了。@user3217883我检查了你的编辑问题。当你复制第二个版本时,你错过了一些东西。你忘记了返回。这就是它失败的原因。啊,好吧,我现在明白了。无论如何,我保留了第一个版本。第二个版本对我来说太难理解了。