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) 来查看顺序。这是调用的顺序。
- ./models/kl250-3/mano/mano1.json
- ./models/kl250-3/antebrazo/antebrazo2.json
- ./models/kl250-3/mano/mano2.json
- ./models/kl250-3/base/base1.json
- ./models/kl250-3/base/base2.json
- ./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()
在我的 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) 来查看顺序。这是调用的顺序。
- ./models/kl250-3/mano/mano1.json
- ./models/kl250-3/antebrazo/antebrazo2.json
- ./models/kl250-3/mano/mano2.json
- ./models/kl250-3/base/base1.json
- ./models/kl250-3/base/base2.json
- ./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()