以下是我在SAPUI5中用来从odata服务获取数据的代码:
var sServiceUrl = "http://localhost:8080/PlanningV0_2/proxy/sap/opu/odata/sap/ZPM_OM_WORKMANAGER_SRV";
var oOdataModel = new sap.ui.model.odata.v2.ODataModel(sServiceUrl);
var oView = this.getView();
var oEmployeeModel = new JSONModel();
var oOperationModel = new JSONModel();
var aEmployees = [];
var aOperations = [];
//set odata models
var readEmp = oOdataModel.read("/EmployeeSet",{
success : function(oData,response){
oEmployeeModel.setData(oData);
oView.setModel(oEmployeeModel,"EmployeeModel");
aEmployees = oEmployeeModel.getData().results;
},
error : function(oError){
console.log(oError);
}
});
var aFilters = [new Filter("PersNo",FilterOperator.NE,"00000000")];
var readOp = oOdataModel.read("/OrderOperationSet",{
filters : aFilters,
success : function(oData,response){
oOperationModel.setData(oData);
oView.setModel(oOperationModel,"OperationModel");
aOperations = oOperationModel.getData().results;
},
error : function(oError){
console.log(oError);
}
});
在那些读取函数之后,我想重用数组aEmployees和aOperations来构建自定义模型并将其绑定到我的视图。问题是:这些函数是异步的。如果我在最后一行之后放置console.log(aEmployees)
,它会显示一个空数组。
如何等待两个异步函数的结束才能使用数组?
我寻找像sleep()或wait()这样的东西来等待异步函数的结束,但它似乎并不存在于JavaScript中。
编辑:PRECISION 我问,因为我更愿意避免使用setTimeout,因为我不想将处理代码放入回调中,我觉得它很难读,我想访问'这'如果需要的话很容易,而且我不想使用硬编码的等待时间。
编辑:答案根据@Qualiture的建议,我使用attachBatchRequestCompleted
来构建数组:
oOdataModel.attachBatchRequestCompleted(function(){
var aEmp = oView.getModel("EmployeeModel").getData().results;
var aOp = oView.getModel("OperationModel").getData().results;
});
与odata模型绑定了多少请求并不重要,此事件处理程序最终会捕获所有请求。显然,这是一个回调,但我发现没有它是不可能的。关键是我不必对等待时间进行硬编码。
答案 0 :(得分:1)
使用ODataModel的attachRequestCompleted
事件处理程序:
yourModel.attachRequestCompleted(function(oEvent){
var oModel = oEvent.getSource();
//etc
});
为两个模型执行此操作,一旦捕获了两个事件,您就可以构建自定义模型结构的魔力