记录一个项目中的矛盾

来源:互联网 发布:淘宝新势力周报名入口 编辑:程序博客网 时间:2024/05/01 18:33

背景是这样子的:

页面上个若干个svg节点,要把这些svg变成png发送到后台插入word中

解决方案:遍历这些svg节点,利用saveSvgAsPng脚本,把这些svg转化为pngUri并放到一个数组中,然后把数组转化为字符串利用ajax请求发送到后台

问题所在:这脚本调用的时候要传入svg节点和一个以pngUri为参数的异步回调函数,

当只有一个svg节点的时候好办,直接把请求放到回调函数里面就行了,

可是有多个节点的情况下,你要用循环,这就出现了困难:

请求放在回调函数里面吧,就会被执行很多次,每一次数组会增加一个元素,只有最后一次发送的数据才是包含了所有uri的数组

请求放在外面吧,因为异步调用,ajax请求会先执行,此时数组里并没有数据


我被这个问题困扰了很久很久,刚开始还不知道错在哪里,发现错误原因后,考虑着能不能把脚本里面的异步回调函数弄成同步的?但是,想走这个方向,很难,当时我只是个超级新手+菜鸟(连异步调用都没看明白),更别说看懂那个转换的脚本了,后来还是朝着另外一个方向走,把请求放在回调函数里面,想办法让他只执行一次,于是就有了一个不太满意的解决办法,先记录下svg节点数,然会在回调函数里面写个if语句,if(调用次数等于svg节点数)执行ajax请求,问题是解决了,但是不太满意。


之后又看了关于闭包的概念,想着和这个地方应该有点关系,在自己的电脑上重现当初的代码(因为没实习了),果然还真有关系,主函数执行完毕之后,异步回调函数执行时还能记得当初的uri,而且,既然他是回调函数,那就要先注册啊,注册总是在执行ajax之前吧,于是,我插了几个断点,结果证明我的想法是对的,所以我在注册的时候顺便把uri装进数组,然后回调函数什么都不干。这次解决方案好多了,不用写if语句了,ajax的数组也正确了,但是还是不够优雅,感觉随便改别人的脚本不太好。


居然又发现了缺陷!发送svg数组后,我居然在服务器的某个目录先生成了png图,在读写word的时候,我把图片路径作为参数,不对劲啊,应该直接把uri转成图片流送到读写word的方法里面啊,不然你写好word之后还要把服务器的图片删除!

0 0
原创粉丝点击