为什么javascript回调函数不执行?
有人能解释为什么loadData(符号)之后的回调函数没有被调用吗?我有这个功能:为什么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
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我检查了你的编辑问题。当你复制第二个版本时,你错过了一些东西。你忘记了返回。这就是它失败的原因。啊,好吧,我现在明白了。无论如何,我保留了第一个版本。第二个版本对我来说太难理解了。