前段时间需要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") })