2016-03-01 69 views
2

在我的JSP文件中,我创建了对同一个javascript函数(setURL函数)的多个调用。按JSP编写的按顺序执行的javascript函数调用

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(网址)看到的顺序。这是拨打电话的顺序。

  1. ./models/kl250-3/mano/mano1.json
  2. ./models/kl250-3/antebrazo/antebrazo2.json
  3. ./models/kl250-3/mano/mano2。 JSON
  4. ./models/kl250-3/base/base1.json
  5. ./models/kl250-3/base/base2.json
  6. ./models/kl250-3/antebrazo/antebrazo1.json

An d有趣的是,如果我重新加载页面,订单是不同的。

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

SOLUTION

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 
});  
} 

我添加另一个函数的使用该阵列,现在所有的工作。

谢谢大家对你的答案

回答

1

首先在所有url的js中有一个数组。

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

然后通过读取数组逐个处理它们。 一旦一个请求完成,执行另一个请求。

OR

还有其他选择,而使用load(),你可以选择直接$.ajax()如果你需要在什么.load额外的控制()提供像异步= “假”

而且其他人一样:

  • $获得()
  • $ .getJSON()
  • $ .getScript()
  • $。员额()
+0

您的答案帮助我获得了解决方案。有点不同。我编辑问题以添加解决方案 – Cadeq

0

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

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

loader.load是异步的。意思是,它为第一个文件启动json文件下载,并且不会等待它完成。它开始执行第二个命令。所以成功的功能取决于哪一个先完成负载。该订单位于一排加载速度更快的文件中。要使其同步,您必须检查.load声明中的选项。对于e-g类似的命令$ .ajax有以下选项$.ajax({ async: false,

+0

的喜感谢您的回答。我编辑了这个问题,在他加载后添加HTML。 – Cadeq

+0

是的,这是预期的。因为'loader.load'是异步的。意思是,它为第一个文件启动json文件下载,并且不会等待它完成。它开始执行第二个命令。所以成功的功能取决于哪一个先完成负载。该订单位于一排加载速度更快的文件中。为了使它同步,你必须在'.load'语句中检查选项。对于e-g类似的命令$ .ajax有以下选项'$ .ajax({async:false,' – Thanga