2012-05-15 2 views
0

을 기능을 처리하는 방법을 나는 다음과 같은 문제가 있습니다자바 스크립트 - 순서가 아닌 한 번에

이의 내가 그것을받은 매개 변수에 따라 뭔가를 할 배열을 처리하는 기능을한다고 가정 해 봅시다합니다. 그래서 뭔가는 같은 :

var arr = []; 

function processArr(p1, p2, ....){}; 

P1, P2 등은 우리가 얻을 수 있도록 서버에서 수신 :

실제로위한 PHP는하지만 정말 중요하지 않습니다
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...) 
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...) 
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...) 
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...) 
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...) 

.

문제점 : js는 동시에 호출하지 않고 (동시에는 아니지만 충분히 근접하여) 호출을 처리합니다. 따라서 첫 번째 호출에서 배열에 요소를 추가하고 (다른 처리) 두 번째 호출에서 요소를 삭제하려고하면 요소가 삭제되지 않으므로 요소가 아직 추가되지 않았기 때문에 존재하지 않습니다.

두 번째 전화를 걸어 첫 번째 전화가 끝날 때까지 기다리려면 어떻게해야합니까?

추가 기능 : 나는의 0.5 초 모든 것이 잘 작동 가정 해 봅시다와 두 번째 호출에 시간 제한을 추가하는 경우

function processSaved(act, params) 
    { 
     if (act == 1) 
     { 
      var newUser = params; 
      if (user.id == newUser.id) 
       user = clone(newUser); 
      activeElementIndex = i; 
      // Go to the next level from the active element level 
      var newLevel = newUser.level; 

      // Set current level 
      currentLevel = Math.max(currentLevel, newLevel); 

      // Create new object and push it to elements array 
      var obj = newUser; 
      elements.push(obj); 
      activeElementIndex = newUser.parent; 
      // Add element to order list 
      if (orderElements.length + 1 > newLevel) 
      { 
       var added = 0; 
       for (var i = 0; i < orderElements[newLevel - 1].el.length; i++) 
       { 
        if (elements[activeElementIndex].column < elements[elements[orderElements[newLevel - 1].el[i]].parent].column) 
        { 
         orderElements[newLevel - 1].el.splice(i, 0, elements.length - 1); 
         added = 1; 
         break; 
        } 
       } 

       if (added == 0) 
        orderElements[newLevel - 1].el.push(elements.length - 1); 
      } 
      else 
      { 
       var tmp = new Array(); 
       tmp.push(elements.length - 1); 
       var obj = {"el": tmp}; 
       orderElements[newLevel - 1] = obj; 
      } 

      flagCreate = 1; 
      actions.push(newUser); 
      // Call the rearange function 
      rearangeElementsWithoutRedraw(); 
     } 
     else if (act == 0) 
     { 
      activeElementIndex = params.index; 
      deleteNode(); 
     } 

     return true;             
    } 

먼저 호출이 행위로 이루어집니다 = 1 두 번째는 행위 = 0으로한다. 그렇지 않으면 요소가 존재하지 않기 때문에 제거시 오류가 발생합니다. 이것은 첫 번째 완료 전에 두 번째 호출이 수행되었음을 나타냅니다.

+0

이 'processArr'는 정확히 무엇을 수행합니까? – Joseph

+0

아니요, 그렇지 않습니다. 아니면 processArr가 비동기 작업을 수행합니까? – Bergi

+0

processArr 코드에 문제가있는 것 같습니다. 무엇을하려고합니까? –

답변

2

JS는 함수를 병렬로 호출하지 않습니다. processArr 기능이 순차적으로 실행됩니다.

이것은 분명히 예를 들어 시작하지 않은 것으로 가정합니다. 함수에서 AJAX 요청 - 다음 함수를 수행하는 경우 분명히 요청이 완료 될 때까지 기다리지 않습니다 (동기식 일 때까지).

+0

기능이 추가되었습니다. 참고 : 아약스 요청이 없습니다. 모든 함수는 동일한 스크립트에 정의되어 있고 저항력이 없습니다 ... 추가 할 세부 정보는 없습니다. D – zozo

0

발견. 내가 사용하고 있던 라이브러리 (raphaeljs)에 의해 비동기 호출이 발생했습니다. 시간 상실에 대비하십시오. :).

관련 문제