如何在 UI5 中等待 JSONModel.loadData() 请求

新手上路,请多包涵

在 SAPUI5/OpenUI5 中,我有一个 JSONModel 我从服务器填充一个文件:

 var oModel = new JSONModel();
oModel.loadData("http://127.0.0.1/data/config.json");
console.log(JSON.stringify(oModel.getData()));

控制台记录 undefined 因为请求是异步的。

如何使其同步,以便在加载数据后调用 console.log()

原文由 Benvorth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 512
2 个回答

不推荐使用同步 ajax 请求,因为它会阻塞 UI,并且可能会导致控制台出现警告。

您可以附加到 Model.requestCompleted 事件以访问异步加载的数据:

 oModel.attachRequestCompleted(function() {
        console.log(oModel.getData());
    });

原文由 schnoedel 发布,翻译遵循 CC BY-SA 3.0 许可协议

从 UI5 版本 1.64.0 开始,API loadData 返回一个 Promise 实例:

 logLoadedData: async function () {
  const jsonModel = new JSONModel();
  await jsonModel.loadData("<host>/data/config.json");
  console.log(jsonModel.getData()); // after the loadData promise is resolved
},

或者,还有 API dataLoaded 也返回一个承诺。当 loadData 发送的所有请求完成时,它将解决。这是没有异步等待的语法:

 doSomethingWith: async function (jsonModel) {
  // Not sure if the model has all data loaded? Just use dataLoaded:
  await jsonModel.dataLoaded();
  console.log(jsonModel.getData());
},

当以字符串 (URL) 作为参数调用 JSONModel --- 的构造函数时,也会在内部调用 API loadData 。在这种情况下, dataLoaded 也可能派上用场。

原文由 Boghyon Hoffmann 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题