javascript函数按顺序调用,由JSP生成

时间:2016-03-01 14:41:47

标签: javascript java jquery jsp synchronous

在我的JSP文件中,我创建了几个对同一个javascript函数(setURL函数)的调用。

JSP文件

<script src="js/webGL.js"></script>
<script type="text/javascript">
        <%
            Brazo brazo = brazoDAO.getBrazo(id);

            List<Pieza> piezas = brazo.getPiezas();

            int i=piezas.size()-1;
            while(i>=0)
            {
                String url=piezas.get(i).getUrl();
                String tipo=piezas.get(i).getTipo_fk().getNombre();
                List<SubPieza> subPiezas = piezas.get(i).getSubPiezas();
                int u=0;
                while(u<subPiezas.size())
                {
                    String conf=subPiezas.get(u).getConf().toString();
                    int n = subPiezas.get(u).getOrden();
                    %>          
                    setURL(<%="\""+url+"/"+tipo+"/"+tipo+n+".json\""%>,<%=conf%>);
                    <%
                    u++;
                }
                i--;
            }
        %>          
    </script>

这是javascript函数setURL。此函数位于webGL.js文件中

WebGL.js

function setURL(url, conf)
{   
 loader.load(url, function(geometry,materials)
 {
    // some code        
 });    
}

当我调试javascript文件时,我看到调用的顺序与JSP文件不同。

如何按顺序拨打电话?

谢谢

- + - + - + - + - + - + - + - +

修改

这就是HTML所拥有的

<script type="text/javascript">

                    setURL("./models/kl250-3/hand/hand1.json","pos:0,0,0;rot:0,0,0;sca:1,1,1;lim:0,1;");

                    setURL("./models/kl250-3/hand/hand2.json","pos:0,0,0;rot:0,0,0;sca:1,1,1;lim:0,1;");

                    setURL("./models/kl250-3/elbow/elbow1.json","pos:0,0,0;rot:0,0,0;sca:1,1,1;lim:0,2;");

                    setURL("./models/kl250-3/elbow/elbow2.json","pos:0,0,0;rot:0,0,0;sca:1,1,1;lim:0,1;");

                    setURL("./models/kl250-3/base/base1.json","pos:0,0,0;rot:0,0,0;sca:1,1,1;lim:0,0;");

                    setURL("./models/kl250-3/base/base2.json","pos:0,0,0;rot:0,0,0;sca:1,1,1;lim:4,0;");

    </script>

所谓的预期呼叫顺序是:hand1,hand2,elbow1,elbow2,base1,base2

在setUrl()里面我放了一个console.log(url)来查看订单。这是调用的顺序。

  1. ./模型/ kl250-3 /真/ mano1.json
  2. ./模型/ kl250-3 / antebrazo / antebrazo2.json
  3. ./模型/ kl250-3 /真/ mano2.json
  4. ./模型/ kl250-3 /碱/ base1.json
  5. ./模型/ kl250-3 /碱/ base2.json
  6. ./模型/ kl250-3 / antebrazo / antebrazo1.json
  7. 必须有趣的是,如果我重新加载页面,顺序是不同的。

    - + - + - + - + - + - + - + - + - +

    objectCount从0开始

    function setURL(url, conf)
    {   
     var currentOrder=objectCount;
     objectCount+=1;
    
     var modelo = new THREE.Mesh();
     modelo.index=currentOrder;
     objectsArray[currentOrder]=modelo;
    
     loader.load(url, function(geometry,materials)
     {
        //some code
     });    
    }
    

    我添加了另一个函数来使用数组,现在一切正常。

    谢谢大家的回答

2 个答案:

答案 0 :(得分:1)

Have an array in js of all the urls first.

var arr;
int i = 0;
function setURL(url, conf)
{   
    arr[i] = url; 
    i++;
}

Then process them at the end one by one by reading the array. Once one request finished, execute the other one.

OR

There are alternatives rather to use load(), you can opt for $.ajax() directly if you need additional control over what .load() offers like async="false".

Also others like:

  • $.get()
  • $.getJSON()
  • $.getScript()
  • $.post()

答案 1 :(得分:0)

Javascript始终(并且已经在您的情况下)同步。加载和成功函数触发器取决于您在各种调用中加载的URL。如果url内容较少且加载速度较快,则首先执行其成功函数。

检查页面的源html。您可以看到您的setURL(函数的顺序与您在JSP代码中的顺序完全相同。

loader.load是异步的。意味着,它启动第一个文件的json文件下载,并且它不会等待它完成。它开始执行第二个命令。因此,成功函数取决于首先完成负载。订单在一行文件中,加快了加载速度。要使其同步,您必须在.load语句中检查选项。对于e-g类似命令,$ .ajax具有以下选项$.ajax({ async: false,