2016-03-01 98 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