关于jdGrid解决异步的问题

前段时间需要jdGrid表格返回的数据通过非对称解密。第一次尝试我在formatter里把数据解密,然后一直解密不出来,原来AES的非对称加密是异步的,也就是说,在解密的同时表格的数据已经加载完了,所以说这是行不通的。第二个思路就取到返回的数据源,把数据源改造,然后在让列表重新加载。这条思路是行的通。那么,第一步是拿到返回的数据源,需要用到jdGrid自带的loadComplete方法,参数是xhr,这个对象是返回的数据,然后就是异步解密,然后在解密的回调里重新渲染表格。以下是代码。异步的代码是前端同事协助写的,具体为什么这么写原谅我一个后端真的不懂。主要是提供一个解决异步的思虑,其中解密就不给出代码了。

loadComplete: function(xhr){
                    var obj = xhr.result;
                    //声明新的数组,存放解密后的数据
                    var jieArray = [];
                    //循环数据,逐个解密
                    for(var i = 0; i < obj.length; i++){
                        var o = obj[i];
                        var pwd = o.pwd;
                        p = p.then(jieName(o));
                    }
                    //声明promise对象
                    var p = new Promise(function (resolve) {
                      resolve();
                    })
                    //解合同名称和合同编号
                    function jieName(object) {
                      return function test_() {
                        return new Promise(function (resolve) {
                            window.ETHjiemi(key,object.pwd,function(jiePwd){
                                //jiePwd 解密后的明文
                                console.log(jiePwd);
                                //用随机密码解出合同名称
                                var name = window.AESjiemi(object.name, jiePwd);
                                //用随机密码解出合同编号
                                var number = window.AESjiemi(object.number, jiePwd);
                                object.name = name;
                                object.number =number;
                                jieArray.push(object);
                                resolve(null);
                            })
                        })
                      }
                    }
                    
                    p.then(function() {
                        xhr.result = jieArray;
                        console.log(xhr);
                        $("#jqGrid").jqGrid('clearGridData');  //清空表格
                        //重新渲染
                        $("#jqGrid")[0].addJSONData(xhr.result);
                    })
                }

下面是前端同事发给我的解决异步的代码,希望给不会的盆友一点启示

var p = new Promise(function (resolve) {
      resolve();
    })
    function test(i) {
      return function test_() {
        return new Promise(function (resolve) {
          setTimeout(function () {
            console.log(i)
            resolve()
          }, 100)
        })
      }
    }

   for(var i = 0; i < 10; i++) {
     p =p.then(test(i));
    }

    p.then(function() {
      console.log("===<<<done")
    })
View Code
原文地址:https://www.cnblogs.com/ly-gaoshuaige/p/11950078.html