JavaScript에서 '동기화' -_- 컴질 - 프로그래밍

jQuery의 each와 post를 쓰는데 한가지 문제점이 발생했다.

function testAjax(){
    var i=0;
    $('.test').each(function(i){
        $.post('test.php'.{mode:'test'},function(data){
            if(data=='SUCCESS') i++;
        });
    });
    alert(i);
}


요런식으로 each와 post가 중첩되어 있는 코드였는데,
저 맨 아랫줄의 i는 ajax로 돌아온 값이 SUCCESS더라도 '거의 항상' 0이 된다는게 문제다 -_-;

아마 저 function들 중(post나 each)에서 어떤 녀석이 setTimeOut을 통해서 돌리는게 있다는 건데,


우선 저 each로 돌려야 할 갯수가 몇개인진 분명히 알 수 있는 상태였으므로

function testAjax(count){
    var i=0;
    $('.test').each(function(i){
        $.post('test.php'.{mode:'test'},function(data){
            count--;
            if(data=='SUCCESS') i++;
        });
    });
    while(true){
        if(count==0)break;
    }
    alert(i);
}

이렇게 만들어 보았으나,
JavaScript는 멀티 스레드 체제가 아니었으므로 -_-

count--; 가 실행될 가능성은 0[...]

[애초에 sleep조차 없는 while문이 스핀락이 될 수 있는가도 의문이지만]

따라서 이렇게 해결했다.

function testAjax(count){
    var i=0;
    $('.test').each(function(i){
        $.post('test.php'.{mode:'test'},function(data){
            count--;
            if(data=='SUCCESS') i++;
        });
    });
    var interval=setInterval(function(){
        if(count==0){
            clearInterval(interval);
            alert(i);
        }
    },100);
}


-_-;; 뭐야 이게

덧글

  • 허진영 2010/01/05 13:23 #

    post 메소드 대신 ajax 메소드를 쓸 수 있을까요? ajax 메소드는 async 옵션이 있으니 혹시 해결책이 될까 해서 남겨놓습니다 :-)
  • 한글이 2010/01/05 16:42 #

    post메소드에도 async옵션이 있을듯 한데요..
  • Hide_D 2010/01/06 21:04 #

    async를 이용하면 동기화가 되는군요[...]
  • LazyGyu 2010/02/08 14:59 #

    function testAjax(count){
    var i=0;
    $('.test').each(function(i){
    $.post('test.php'.{mode:'test'},function(data){
    count--;
    if(data=='SUCCESS') i++;
    if(count == 0) alert(i);
    });
    });
    }

    요렇게 하면 되지 않을까요..
※ 로그인 사용자만 덧글을 남길 수 있습니다.



메모장

W 위젯