Javascript JS&;SAPUI 5:在不设置超时的情况下等待2个异步函数

Javascript JS&;SAPUI 5:在不设置超时的情况下等待2个异步函数,javascript,asynchronous,sapui5,Javascript,Asynchronous,Sapui5,以下是我在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.getVie

以下是我在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);
            }
        });
在这些读取函数之后,我希望重用数组、部署和操作来构建自定义模型并将其绑定到视图。问题是:这些函数是异步的。如果我将
console.log(aEmployees)
放在最后一行之后,它将显示一个空数组

如何等待两个异步函数结束后使用阵列?

我寻找了一些类似sleep()或wait()的东西来等待异步函数的结束,但JavaScript似乎不存在

EDIT:PRECISION我之所以这样问,是因为我更喜欢避免设置超时,因为我不想将治疗代码放入回调,我发现它可读性太强,如果需要,我想轻松访问“this”,我不想使用硬编码的等待时间

EDIT:ANSWER根据@quality advisions,我使用了
附件batchrequestcompleted
,来构建数组:

oOdataModel.attachBatchRequestCompleted(function(){
            var aEmp = oView.getModel("EmployeeModel").getData().results;
            var aOp = oView.getModel("OperationModel").getData().results;
        });

不管有多少请求绑定到odata模型,这个事件处理程序最终都会捕获它们。很明显,这是一次回调,但我发现没有它是不可能处理的。关键是我不必硬编码等待时间。

使用ODataModel的
attachRequestCompleted
事件处理程序:

yourModel.attachRequestCompleted(function(oEvent){
    var oModel = oEvent.getSource();
    //etc
});

对这两个模型都这样做,一旦捕获了这两个事件,就可以神奇地构建自定义模型结构了

只有一个ODataModel被更改了两次,其他的是JSONModel,没有这个处理程序。我考虑过了,但即使使用文档,我也不明白处理程序将如何等待两次读取。然后使用相同的处理程序,并用返回的数据填充相应的数组。一旦两个数组都包含数据,就处理自定义模型实际上,它是sap.ui.model.odata的
attachBatchRequest
。v2.ODataModel。因为我将模型绑定到视图,所以在处理程序中调用函数
getModel()
,它就可以工作了。谢谢。很高兴它能工作!实际上,回调非常棒,因为它们允许异步性,并且(当正确使用函数时)实际上允许代码具有更好的可读性。另一方面,
sap.ui.model.odata.ODataModel.read
不将数据存储到模型中,而
sap.ui.model.odata.v2.ODataModel.read
将数据存储到模型中。快乐编码!:)