• Django中的ajax细节


    原代码

    1. <script>
    2. $(function () {
    3. // 根据id获取展示框
    4. var viewer = $3Dmol.createViewer("gldiv");
    5. var pdbModel, sdfModel;
    6. var colorpdb = '700080', colorsdf = '000F00';
    7. // 这里两个src表示文件路径
    8. var sdf = '../resources/sdf/99.sdf';
    9. var pdb = '../resources/pdb/4iiy.pdb';
    10. // 加载pdb和sdf文件 相对路径
    11. $.when($.get(pdb), $.get(sdf)).done(function (pdbData, sdfData) {
    12. pdbModel = viewer.addModel(pdbData[0], "pdb");
    13. sdfModel = viewer.addModel(sdfData[0], "sdf");
    14. viewer.setStyle({model: pdbModel}, {cartoon: {color: colorpdb}}); // 六进制颜色代码,不含透明度
    15. viewer.setStyle({model: sdfModel}, {stick: {color: colorsdf}});
    16. viewer.zoomTo();
    17. viewer.render();
    18. });
    19. script>

    代码功能

    这里想用3Dmol.js进行分子的3D渲染,通过改变sdf和pdb对应的值,来渲染不同的文件

    那么在后端自然而然就想到,在服务器中存好对应文件后,保存对应文件路径并通过模版中的变量写法来改变这里的src的值


    问题发现

    后端处理无误的情况下前端仍无法正确显示对应结果

    经过我路由调试,视图函数的返回结果,网页中请求的抓包,最终判断我后端处理已经正确

    抓包得到的响应结果中,这里的sdf与pdb也修改为了对应后端给出的结果

    然后单独访问服务器对应url的资源,发现可以得到正常返回,所以该路径无论从服务器层面还是后端角度都是正确的,但是我的文件无法得到正常渲染

    起初还有一种可能,就是3Dmol.js的库文件由于网络问题没有被我正常响应拿到结果

    但是反过头看网络的抓包请求,均返回200 OK,所以也排除


    原因

    通过查阅相关资料,回想起ajax本身是异步的,也就是说我对pdb和sdf改变之前,可能就已经执行了下面那些进行渲染的代码

    解决

    那么对应的方案就是一定要让渲染的操作在对sdf与pdb赋值之后再执行

    也就是再多层嵌套.$ajax{....}

    更改代码

    1. <script>
    2. $(function () {
    3. var viewer = $3Dmol.createViewer("gldiv");
    4. var pdbModel, sdfModel;
    5. var colorpdb = '700080', colorsdf = '000F00';
    6. var sdf = "{{ MEDIA_URL }}{{ sdf }}";
    7. var pdb = "{{ MEDIA_URL }}{{ pdb }}";
    8. // 使用$.ajax()代替$.get()
    9. $.ajax({
    10. url: pdb,
    11. success: function (pdbData) {
    12. pdbModel = viewer.addModel(pdbData, "pdb");
    13. viewer.setStyle({model: pdbModel}, {cartoon: {color: colorpdb}});
    14. // 在第一个文件加载完成后加载第二个文件
    15. $.ajax({
    16. url: sdf,
    17. success: function (sdfData) {
    18. sdfModel = viewer.addModel(sdfData, "sdf");
    19. viewer.setStyle({model: sdfModel}, {stick: {color: colorsdf}});
    20. viewer.zoomTo();
    21. viewer.render();
    22. }
    23. });
    24. }
    25. });
    26. });
    27. script>
  • 相关阅读:
    微信小程序--Taro框架实际开发中的问题汇总
    CSS点击切换或隐藏盒子的卷起、展开效果
    奶牛排序问题
    2022.7.25-7.31 AI行业周刊(第108期):值钱比赚钱更重要
    后端开发进阶之路:后端开发核心竞争力之一抽象建模能力
    【项目经验】elementui--table表格自定义表头及bug
    使用composer开发自己的扩展包
    擦除编码(EC)数据中心中的最优机架协调更新
    三分钟查询出快递单号物流延误更新的
    Unity Debug的简单封装
  • 原文地址:https://blog.csdn.net/G_yyyy/article/details/136665691