This question already has answers here:
Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference
(6个答案)
5个月前关闭。
变量
项目将被一一推送到
以下示例中的
但是,
数组如何包含10个元素,但其长度为
预期成绩:
第一个日志将输出数组,当您检查它时,项目将在此处-当您访问
要解决此问题,您可以将
使用sapui,您可以将数组作为json模型返回,然后可以绑定到视图中:
在表格中显示日期的Plunker示例:Plunker Holiday Example
(6个答案)
5个月前关闭。
变量
datelist
应该是包含许多项的数组。项目将被一一推送到
oModel.attachRequestComplete()
函数中的列表中。以下示例中的
console.log(datelist)
列出了所有必需项(10个项)。但是,
datelist.length
属性是0
。数组如何包含10个元素,但其长度为
0
?预期成绩:
datelist
应包含所有项目datelist.length
应该是> 0
var datelist = [];
var oModel = new sap.ui.model.json.JSONModel();
oModel.attachRequestCompleted(function() {
var oFeiertageBerlin = oModel.getData().BE;
for (var prop in oFeiertageBerlin) {
datelist.push(oFeiertageBerlin[prop].datum);
}
});
console.log(datelist);
var jDatum = new Date();
var jLink = "https://feiertage-api.de/api/?jahr=" + jDatum.getFullYear();
oModel.loadData(jLink);
// Why is datelist.length == 0 here?
console.log(datelist, datelist.length);
最佳答案
oModel.loadData
将异步请求数据。
请求完成后,将调用传递给attachRequestCompleted
的回调(在数据可用之前,执行不会在loadData()
处阻塞)
当您的console.log(datelist, datelist.length);
行运行时,datelist
仍将是一个空数组。
之所以可以在浏览器控制台中看到数组中的项目,是因为在检查请求时,该请求已经完成。
您可以在浏览器控制台中尝试以下操作:
var arr = [];
console.log(arr, arr.length); // [], 0
arr.push(1); arr.push(2); arr.push(3);
// console.log(arr, arr.length); // [1,2,3], 3
第一个日志将输出数组,当您检查它时,项目将在此处-当您访问
.length
时,它们还不存在。要解决此问题,您可以将
datelist
保留在请求完成的处理程序中:var oModel = new sap.ui.model.json.JSONModel();
oModel.attachRequestCompleted(function() {
var oFeiertageBerlin = oModel.getData().BE;
var datelist = [];
for (var prop in oFeiertageBerlin) {
datelist.push(oFeiertageBerlin[prop].datum);
}
console.log(datelist, datelist.length);
// do something with the datelist here
});
var jDatum = new Date();
var jLink = "https://feiertage-api.de/api/?jahr=" + jDatum.getFullYear();
oModel.loadData(jLink);
使用sapui,您可以将数组作为json模型返回,然后可以绑定到视图中:
function loadHolidays() {
var result = new sap.ui.model.json.JSONModel({datelist: []});
var oModel = new sap.ui.model.json.JSONModel();
oModel.attachRequestCompleted(function() {
var oFeiertageBerlin = oModel.getData().BE;
var datelist = [];
for (var prop in oFeiertageBerlin) {
datelist.push(oFeiertageBerlin[prop].datum);
}
result.setData({datelist: datelist});
});
var jDatum = new Date();
var jLink = "https://feiertage-api.de/api/?jahr=" + jDatum.getFullYear();
oModel.loadData(jLink);
return result;
}
var model = loadHolidays();
// attach model to view
// e.g. sap.ui.getCore().setModel(model);
在表格中显示日期的Plunker示例:Plunker Holiday Example
09-29 23:41