2014-01-13 2 views
0

나는 "add_floor (xxx)"라는 함수를 루프에 넣는다. (벨로우 참조), 완성되기까지 약간의 시간이 걸리기 때문에,이 함수가 돌아 오기 전에 기다리는 법을 알고 싶다. 내 경우에는 다음 단계로 이동 "dawfeature 포인트를 추가". 나는 콜백 메소드를 사용할 수 있다고 생각하지만, 콜백 함수를 호출 할 때 json 요소를 거치는 완전한 루프를 다시 시작해야한다. 정말 섹시하지 않기 때문에 이것을 피할 수있는 방법이 있습니까?자바 스크립트가 반환 할 함수를 기다림.

function add_maps_from_json(json) { 
    for (var i = 0; i < json.maps.length; i++) { 
    // add the maps to the combox box and display last one 
    add_floor(json.maps[i].mapName); 

    // add the dawfeature points to the map 
    for (var j = 0; i < json.maps[i].APs.length; j++) { 
     var idx = find_map_index(); 
     console.log(idx); 
     var map = mapObjectArray[idx]; 
     etc... 
     etc... 

    } 
    } 
} 
+3

유일한 방법은 그냥 따르지 않는 것 이전 코드에서 익명 함수를 작성하거나 아약스 호출 또는 시간 초과 함수를 수행하는 경우입니까? – rorypicko

+2

여기에 AJAX 호출이 있습니까? 그렇지 않으면 이것은 동기되어야합니다. 그것이 * 돌아 오기 전에 끝날 때까지 기다리는 것을 의미합니다. AJAX 호출을 사용하는 경우 * 유일한 방법은 콜백입니다. –

+0

'add_floor()'는 무엇을합니까? 통화를 동기화 하시겠습니까? – DontVoteMeDown

답변

1

당신은 당신이 add_floor에 콜백 매개 변수를 추가해야하고 루프를 관리하기 위해이 같은 async loop을 할 수 말했듯이 :

//change the add_floor function 
function add_floor(mapName, callback){ 
    //your code 
    //you probably have some kind of ajax call or setTimeout 
    //then call your callback after your ajax response or timer callback 
    //.... 
    callback(); 
    //.... 
} 

function add_maps_from_json(json) { 
    doLoop(json, 0) 
} 

function doLoop(json, i) { 
    if(i < json.maps.length) return; 
    add_floor(json.maps[i].mapName, function() { 
     // add the dawfeature points to the map 
     for (var j = 0; i < json.maps[i].APs.length; j++) { 
      var idx = find_map_index(); 
      console.log(idx); 
      var map = mapObjectArray[idx]; 
      //etc... 
      //etc... 

     } 
     doLoop(json, i + 1); 
    }); 
} 
1

add_floor는 아약스 전화를하지 않는 경우 지금처럼, 당신의 코드가 잘 작동합니다.

add_floor는 Ajax 호출을 할 않는 경우, 당신은 당신이 다음 add_floor에서 아약스 호출에 대한 콜백으로 사용할 별도의 함수 내에서 내부 for 루프를 넣을 수 있습니다.

+0

Ajax를 사용하는 것 외에도 웹 작업자 또는 setTimeout ([Clumpy library] (http://www.tumuski.com/code/clumpy/overview/))을 사용하여 비 차단 호출을 만드는 다른 방법이 있습니다.)는 비 차단 루프를 시뮬레이션합니다. –

1

함수가 변수에 값을 반환하도록 할 수 있습니다. 그러면 프로그램이 실행될 때까지 일시 중지됩니다. 이와 같이 :

var maps = add_maps_from_json(json); 

또는 plugin.js 및 모듈 호출을 사용할 수 있습니다.

http://requirejs.org/docs/plugins.html

+0

안녕하세요. 반환 값 트릭이 작동하지 않습니다. plugin.js를 살펴 보겠습니다. – tony590

관련 문제