Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取异步函数的值,在SAPUI5中完成_Javascript_Sapui5 - Fatal编程技术网

Javascript 获取异步函数的值,在SAPUI5中完成

Javascript 获取异步函数的值,在SAPUI5中完成,javascript,sapui5,Javascript,Sapui5,变量datelist应该是一个包含许多项的数组。 在oModel.attachRequestComplete函数中,项目将被逐个推送到列表中 下面示例中的console.logdatelist给出了包含所有必要项的列表10项。 但是,datelist.length属性为0 一个数组如何包含10个元素,但其长度为0 预期成果: 日期列表应包含所有项目 datelist.length应大于0 oModel.loadData将异步请求数据。 在请求完成后,将调用传递给attachRequestComp

变量datelist应该是一个包含许多项的数组。 在oModel.attachRequestComplete函数中,项目将被逐个推送到列表中

下面示例中的console.logdatelist给出了包含所有必要项的列表10项。 但是,datelist.length属性为0

一个数组如何包含10个元素,但其长度为0

预期成果:

日期列表应包含所有项目 datelist.length应大于0 oModel.loadData将异步请求数据。 在请求完成后,将调用传递给attachRequestCompleted的回调。在数据可用之前,不会在loadData处阻塞执行

当您的console.logdatelist、datelist.length;行运行时,日期列表仍将是空数组。 在浏览器控制台中可以看到阵列中的项目的原因是,在检查请求时,请求已完成。 您可以在浏览器控制台中尝试以下操作:

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时还不在那里

要解决此问题,可以将日期列表保存在请求完成处理程序中:

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示例,其中日期显示在一个表中:

我想对attachRequestCompleted之外的datelist做点什么,如何实现它?@Roman11222您可以在attachRequestCompleted回调之外声明datelist,但是在您传递给attachRequestCompleted的回调运行之前,它将为空。你需要用它做什么?日期列表包含了柏林的所有假日,我将在Calendar@Roman11222您可以使用单独的JSONModel,然后在生成日期列表后对其调用setData。然后可以将此模型绑定到视图以使用日期列表。我用一个新的例子更新了答案谢谢你的回答。我复制了您的示例,并将模式绑定到sap.ui.getCore->model.oData包含0项的日期列表。有什么问题?
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);