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));
函数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));