程序执行的先后顺序导致的问题

一. 问题情形如图:

  • 点击新增,弹出模态框,填写数据之后,点确定保存;

    • 保存前,先去调用接口,动态生成 ak/sk 密钥;
    • 获取模态框的数据;
    • 将两者的数据做整合,生成新的eiInfo,传到后台;
    • 自己写接口,将数据保存到数据库对应的中;
      程序执行的先后顺序导致的问题_第1张图片
  • 模态框数据测试数据

    • 发现ng自带的表单验证也不是特别强大;
    • 只是简单判断手机号为11位,并没有判断手机号是否合法输入;
    • 比如说开头为1,第二位为3,5,7,8等,后几位随机数字的11位手机号;
程序执行的先后顺序导致的问题_第2张图片
  • 整合数据
    • 模态框数据能获取到,调接口能得到ak/sk的数据;
    • 整合的时候,ak/sk 放不到eiInfo中,一直为空;
程序执行的先后顺序导致的问题_第3张图片

二. 对应的js代码如下:

/**
 * Created by adminZz on 2017/8/17.
 */
/**=========================================================
 * ak页面新增列表
 =========================================================*/

(function() {
    'use strict';

    angular
        .module('app.ak')
        .controller('accessKeyWindowController', function ($scope, $log,selectService, $state, $uibModalInstance,eihttp, toaster, bj00Service, ACCOUNT, params) {
            var self = this;
            // 租户单选下拉框,应用系统多选下拉框 指令配置
            self.selectParam = {
            };//查询传参
            self.tenantSelector = {
                selectValue:'',
                selectMode: 'single'
            };//租户单选
            self.appSelector = {
                selectValue:'',
                selectMode: 'multiple'
            };//多选
            self.dataset = params;
            self.userModel = angular.copy(params.object) || {"isGlobal":"","tenantID":"","applicationID":"","contactName":"","contactPhone":"","contactEmail":""};

            // 新增保存功能
            self.save = function () {
                self.accessKeyId = "";
                self.accessKeySecret = "";

                // 调用接口,从outInfo中截取AK/SK的值,然后将AK/SK的数据与模态框输入的数据进行整合,然后写接口进行保存数据

                // 1.获取AK/SK的值 ===项目中新的调用接口的写法
                function createAccessKeyList(){
                    // 传调用服务的id
                    var serviceId ="OCEX00_CREATEACCESSKEY";
                    var eiInfo = new EiInfo();
                    eiInfo.set("serviceId", serviceId); //set方法放值
                    // 发送请求  参考select.service.js文件  配置服务名,方法名,输出结果,  成功回掉函数 ,失败回掉函数
                    eihttp.send({service: 'BC20',method: 'invokeBWService',eiinfo: eiInfo}, renderInput, error);
                };
                createAccessKeyList();
               
              // 成功回掉
                function renderInput(outInfo){
                    console.log("outInfoAll调用接口获取所有数据----->"+JSON.stringify(outInfo));
                    console.log("outInfo封装的方法getAttr()方法获取的是extAttr里面的东西----------->"+outInfo.getAttr().accessKeyId);
                    self.accessKeyId = outInfo.getAttr().accessKeyId;
                    self.accessKeySecret = outInfo.getAttr().accessKeySecret;
                    console.log("ak数据----->"+JSON.stringify(self.accessKeyId));
                    console.log("sk数据----->"+JSON.stringify(self.accessKeySecret));
                    //console.log("输出新建的AK-outInfo--->" + outInfo.getStatus() + outInfo.getMsg());
                };


                // 失败回掉
                function error(){
                    console.log("http error--->");
                    alert('error');
                }


                // 数据整合
                //之前写在外边的时候,发现ak/sk一直取不到值,
                //调试发现是执行顺序的问题,就是这个方法已经执行完了,上面的回掉函数换没执行,
              // 而下面的数据已经获取到了,与成功回掉返回的数据整合时,成功回掉换没取到值,就导致一直取不到数据;

             // 解决方法,将下面的方法放到回掉函数中,等回掉函数取到值之后,在进行数据的整合
               

                var eiInfo = new EiInfo();
                self.appSelector.selectValue = self.appSelector.selectValue?((self.appSelector.selectValue).join(",")):"";
                eiInfo.set("isGlobal",self.userModel.isGlobal);
                eiInfo.set("tenantID",self.tenantSelector.selectValue);
                eiInfo.set("applicationID",self.appSelector.selectValue);
                eiInfo.set("contactName",self.userModel.contactName);
                eiInfo.set("contactPhone",self.userModel.contactPhone);
                eiInfo.set("contactEmail",self.userModel.contactEmail);
                eiInfo.set("AK",self.accessKeyId);
                eiInfo.set("SK",self.accessKeySecret);
                console.log("EiInfo模态框页面的数据 + ak/sk数据====》两者整合-----》"+JSON.stringify(eiInfo));
            };

// 模态框取消按钮
            self.cancel = function () {
                $uibModalInstance.dismiss('cancel');
            };
        });

})();


2.2 问题原因:

之前写在外边的时候,发现ak/sk一直取不到值,调试发现是执行顺序的问题,就是这个方法已经执行完了,上面的回掉函数换没执行完,而下面的数据已经获取到了,与成功回掉返回的数据整合时,成功回掉换没取到值,就导致一直取不到数据

2.3 解决方法:

将数据整合的方法放到回掉函数中,等回掉函数取到值之后,在进行数据的整合

三. 修改js代码,调试结果如下:

(function() {
    'use strict';

    angular
        .module('app.ak')
        .controller('accessKeyWindowController', function ($scope, $log,selectService, $state, $uibModalInstance,eihttp, toaster, bj00Service, ACCOUNT, params) {
            var self = this;
            // 租户单选下拉框,应用系统多选下拉框 指令配置
            self.selectParam = {
            };//查询传参
            self.tenantSelector = {
                selectValue:'',
                selectMode: 'single'
            };//租户单选
            self.appSelector = {
                selectValue:'',
                selectMode: 'multiple'
            };//多选
            self.dataset = params;
            self.userModel = angular.copy(params.object) || {"isGlobal":"","tenantID":"","applicationID":"","contactName":"","contactPhone":"","contactEmail":""};

            // 新增保存功能
            self.save = function () {
                self.accessKeyId = "";
                self.accessKeySecret = "";

                // 调用接口,从outInfo中截取AK/SK的值,然后将AK/SK的数据与模态框输入的数据进行整合,然后写接口进行保存数据

                // 1.获取AK/SK的值 ===项目中新的调用接口的写法
                function createAccessKeyList(){
                    // 传调用服务的id
                    var serviceId ="OCEX00_CREATEACCESSKEY";
                    var eiInfo = new EiInfo();
                    eiInfo.set("serviceId", serviceId); //set方法放值
                    // 发送请求  参考select.service.js文件  配置服务名,方法名,输出结果,  成功回掉函数 ,失败回掉函数
                    eihttp.send({service: 'BC20',method: 'invokeBWService',eiinfo: eiInfo}, renderInput, error);
                };
                createAccessKeyList();
               
              // 成功回掉
                function renderInput(outInfo){
                    console.log("outInfoAll调用接口获取所有数据----->"+JSON.stringify(outInfo));
                    console.log("outInfo封装的方法getAttr()方法获取的是extAttr里面的东西----------->"+outInfo.getAttr().accessKeyId);
                    self.accessKeyId = outInfo.getAttr().accessKeyId;
                    self.accessKeySecret = outInfo.getAttr().accessKeySecret;
                    console.log("ak数据----->"+JSON.stringify(self.accessKeyId));
                    console.log("sk数据----->"+JSON.stringify(self.accessKeySecret));
                    //console.log("输出新建的AK-outInfo--->" + outInfo.getStatus() + outInfo.getMsg());


                // 数据整合===========这里修改

                //之前写在外边的时候,发现ak/sk一直取不到值,
                //调试发现是执行顺序的问题,就是这个方法已经执行完了,上面的回掉函数换没执行,
              // 而下面的数据已经获取到了,与成功回掉返回的数据整合时,成功回掉换没取到值,就导致一直取不到数据;

             // 解决方法,将下面的方法放到回掉函数中,等回掉函数取到值之后,在进行数据的整合
               

                var eiInfo = new EiInfo();
                self.appSelector.selectValue = self.appSelector.selectValue?((self.appSelector.selectValue).join(",")):"";
                eiInfo.set("isGlobal",self.userModel.isGlobal);
                eiInfo.set("tenantID",self.tenantSelector.selectValue);
                eiInfo.set("applicationID",self.appSelector.selectValue);
                eiInfo.set("contactName",self.userModel.contactName);
                eiInfo.set("contactPhone",self.userModel.contactPhone);
                eiInfo.set("contactEmail",self.userModel.contactEmail);
                eiInfo.set("AK",self.accessKeyId);
                eiInfo.set("SK",self.accessKeySecret);
                console.log("EiInfo模态框页面的数据 + ak/sk数据====》两者整合-----》"+JSON.stringify(eiInfo));
            };
                };


                // 失败回掉
                function error(){
                    console.log("http error--->");
                    alert('error');
                };



// 模态框取消按钮
            self.cancel = function () {
                $uibModalInstance.dismiss('cancel');
            };
        });

})();

  • 测试整合数据如图,问题解决:
程序执行的先后顺序导致的问题_第4张图片

剩下的又该一心一意去写接口了,麻蛋的,编辑接口,删除接口,启用接口,禁用接口,没1点概念,刚把得 ---adminZz;

你可能感兴趣的:(程序执行的先后顺序导致的问题)