JS& SAPUI 5:等待2个异步函数,没有setTimeout

时间:2016-07-01 08:54:56

标签: 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.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模型绑定了多少请求并不重要,此事件处理程序最终会捕获所有请求。显然,这是一个回调,但我发现没有它是不可能的。关键是我不必对等待时间进行硬编码。

1 个答案:

答案 0 :(得分:1)

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

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

为两个模型执行此操作,一旦捕获了两个事件,您就可以构建自定义模型结构的魔力