// Best score getters/setters
LocalStorageManager.prototype.getBestScore = function () {



jQuery.when(jQuery.ajax({
    url: request_uri+'index.php',
    type: 'POST',
async: false,
    data: {
        module: 'yakjunmo',
        act: 'dispYakjunmoGetgamedata',
       gubun: '0'
    },
    dataType: 'json',
    contentType: 'application/json'
}))
.done(function (data) {
console.log(data.result);
    return data.result || 0;
});

 
 
};

 

제가 지금 2048이라는 게임을 xe에 디비연동하려고 합니다.

 

해당코드는 디비에 기록된 베스트 스코어를 가져와서 리턴하는 것인데, 

이렇게 하면 아무것도 리턴이 안되어 버립니다.

 

구글링해보니 ajax통신은 기본이 비동기화라서 데이터값을 리턴받을때까지 기다리지 않고 진행되기때문에 그렇다고 하여

동기화 옵션을 추가하면 된다고 했는데, async 옵션을 넣어도 여전히 똑같은데요

 

방법이 없을까요 ?

  • Lv36

    ajax 요청 결과는 return하지 않고 콜백 함수(done에 정의한 함수)에서 직접 처리하고 마무리하는 것이 정석입니다.

    XE 액션이라면 ajax를 직접 실행하지 말고 XE에서 제공하는 exec_json 함수를 사용해 보세요.

     

    exec_json('모듈명.액션', { 데이터 }, function(data) {

        // 결과 받아서 처리

    });

  • Lv36 Lv6
    해당방법으로 해봤는데.. 마찬가지여서요 ㅠ.ㅠ
  • Lv6 Lv36
    안쪽에 있는 함수에서 return할 수가 없으니
    LocalStorageManager.prototype.getBestScore도 아무 것도 반환할 수가 없겠죠.
    먼저 가져온 후에 결과를 어딘가의 변수에 저장해 놓고
    LocalStorageManager.prototype.getBestScore에서는 그 변수값을 읽어 반환하도록 하거나
    아무튼 뭔가 순서를 바꿔야 할 것 같습니다.
  • Lv36 Lv6
    네 그것도 생각해봤어요 맨처음 로딩시에 해봤는데도, ajax 결과나오는 시간이 더 나중이라서

    이것만 지금 3일째 붙잡고 있습니다. 어휴..
  • Lv6 Lv36
    자바스크립트는 뭘 깔끔하게 반환하지 않고 콜백 함수가 꼬리에 꼬리를 물고 이어지니
    다른 언어를 쓰던 사람이 처음 접하면 "이게 뭥미?" 이러기 딱 좋지요 ㅠㅠ
  • Lv12
    외부서버 연동이라면 리퍼러 문제일 가능성이 있습니다.
  • Lv12 Lv6
    외부서버 아니고, 같은 서버에요
  • Lv6 Lv12
    같은 서버인데 xe 에서 모듈끼리 비동기 소켓통신이 안된적이 있습니다.
    대신 curl 에 다가 리퍼러 넣고 전송해 보세요.
    이도 저도 다 안된다면 config.user.inc.php 파일 만들어서 $_SERVER['HTTP_REFERER'] 강제로 입력해 버리셔요....
  • Lv12 Lv6
    아 curl로 한번 해봐야겠군요. 감사합니다.