javascript 按顺序调用函数,JSP

javascript functions calls in order, made by JSP

在我的 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>

Soo 的预期调用顺序是:hand1、hand2、elbow1、elbow2、base1、base2

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

  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

而且一定很有趣的是,如果我重新加载页面,顺序就会不同。

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

解决方案

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

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

谢谢大家的回答

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

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

但是loader.load是异步的。意思是,它开始下载第一个文件的 json 文件,并且不会等待它完成。它开始执行第二个命令。所以成功函数取决于哪个先完成加载。该顺序在一行文件中,可以更快地完成加载。要使其同步,您必须检查 .load 语句中的选项。对于 e-g 类似命令 $.ajax 具有以下选项 $.ajax({ async: false,

首先在js中把所有的url都做成一个数组。

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

然后通过读取数组在最后一个一个地处理。 一个请求完成后,执行另一个请求。

有替代方法而不是使用 load(),如果您需要对 .load() 提供的内容进行额外控制,您可以直接选择 $.ajax(),例如 async="false" .

还有其他人喜欢:

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