조회 수 95 댓글 9
// 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 옵션을 넣어도 여전히 똑같은데요

 

방법이 없을까요 ?

  • profile
    기진곰 2017.03.08 10:42:09

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

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

     

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

        // 결과 받아서 처리

    });

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

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

서버에 요청 중입니다. 잠시만 기다려 주십시오...