javascript - 为什么javascript回调函数没有执行?
问题描述
有人可以解释为什么 loadData(symbol) 之后的回调函数没有被调用吗?我有这个功能:
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;
});
}
但现在我收到错误:Uncaught TypeError: Cannot read property 'then' of undefined at plotChart (moneymachine.html:120) at HTMLTableRowElement。
第 120 行是 loadData(symbol).then(function(data) {
解决方案
的定义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;
});
}
我们可以看到它定义了一个参数,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 的thenable返回$.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);
});
推荐阅读
- python - 不发送所有文本
- javascript - 无法在点击时添加我们自己的反应元素
- html - 具有固定最大宽度和高度的图像,原始纵横比:避免布局偏移
- javascript - 在 API 获取请求上传递请求参数
- vba - 类型不匹配将字符串转换为日期
- java - 如何使用游标从sqlite android中的多个列中获取数据
- apache-spark - 使用 pyspark 将字符串转换为日期时间时为空值
- vba - 记录的一些 Array 公式未转换为公式,而是保留为 RC 格式
- c++ - 在 RISC-V 中这条指令执行结束时 x12 的值是多少?(没有 RARS)
- javascript - 脚本仅在调用 alert() 时有效