Promise 所有语法和可接受操作的框架

Promise All Syntax and the Frame of accepatble Operations

函数Promise.all - 确实有工作,等待异步函数并在完成这些异步函数后执行某些逻辑。我找不到这个功能究竟是如何工作的,即你是否可以做某些事情。

示例:

在此代码中,Upperhalf 直到 Promise.all 确实用数据填充了日期列表。异步函数 attachRequestCompleted - 必须首先完成,以便日期列表将填充数据。

Promise.all 中,我想遍历在 attachRequestCompleted 中填充了数据的日期列表,以便我稍后可以将它们添加为日历中的特殊日期

var datelist = [];
var oModel = new sap.ui.model.json.JSONModel();

console.log(oModel.oData, datelist.length, datelist);

oModel.attachRequestCompleted(function() {
  var oFeiertageBerlin = oModel.getData().BE;
  for (var prop in oFeiertageBerlin) {
    datelist.push(oFeiertageBerlin[prop].datum);
  }
});

var jDatum = new Date();
var jLink = "https://feiertage-api.de/api/?jahr=" + jDatum.getFullYear();
oModel.loadData(jLink);

Promise.all([
  this.oModel.attachRequestCompleted
]).then(
  for (var j = 0; j < datelist.length; j++) {
    console.log(datelist[j]);

  }
)​

预期结果:可以遍历列表

实际结果:语法错误

如其他评论所述,对于 Promise 函数,您需要将事件回调包装在 Promise 中。但是,您最后的评论让我相信 "this.byId" 的根本问题是您需要为回调绑定上下文。因此:

oModel.attachRequestCompleted(function() {
   // now this.byId(...) should work here
}.bind(this));

但是,我建议不要使用此设置并避免使用 JSON 模型的 loadData 函数。为完成/失败等附加事件处理程序对我来说似乎不是很优雅。我宁愿选择 jQuery.ajax() (https://api.jquery.com/jQuery.ajax/) 或手动 XMLHttpRequest。

jQuery 看起来像这样:

var oRequest = jQuery.ajax({
  url: jLink
});
oRequest.done(function() {
  // this.byId(...)
}.bind(this));