2012-07-31 6 views
0

이 코드는 작동하지만 내가 필요로하는 방식이 아니므로 나중에 설명하십시오.함수에서 텍스트를 반환하는 중

getRegisterFiles('regster1') 
function getRegisterFiles(name) { 
    var request = $.ajax({ 
     url: "/../files/Users/"+name+".ctp", 
     type: "GET", 
     dataType: "html" 
    }); 
    request.fail(function(jqXHR, textStatus) { 
     $('#pageLoading p').html('We have experienced a problem. Please try again later.'); 
     return false; 
    }); 
    request.success(function(msg) { 
     placeData(msg); 
    }); 
} 
function placeData(registerData) { 
    $('#pageWrap').html(registerData);      
} 

위의 코드는 .ctp 파일을 가져 와서 화면에 표시합니다. 나는과 같이 기능을 시작합니다 변수에 'MSG'의 내용을 반환 할 대신 성공 부분에 placeData (MSG)를 가진의

을 할 필요 무엇

,

내가 사용 시도
register = getRegisterFiles('register1'); 

,

return msg; 

그러나 그것은 작동하지 않습니다 ... 난 후 반환 MSG와 '경고'를 사용하는 경우 그것이 제공 up으로 정의되지 않음.

다음에 할 일이 무엇인지 잘 모르기 때문에 어떤 아이디어라도 크게 환영받을 것입니다. 죄송합니다. 완전히 새로운 실수입니다.

편집 --- 이것은 내가 시도한 코드입니다. 제가하고 싶은 것을 보여주기를 바랍니다.

var registerStep1 = null; 
var registerStep2 = null; 
function getRegisterFiles(name) { 
    var request = $.ajax({ 
     url: "/../files/Users/"+name+".ctp", 
     type: "GET", 
     dataType: "html", 
     error: function(jqXHR, textStatus) { 
      $('#pageLoading p').html('We have experienced a problem. Please try again later.'); 
      return false; 
     }, 
     success: function(msg) { 
       return msg; 
     } 
    }); 
} 
registerStep1 = getRegisterFiles('registerStep1'); 
registerStep2 = getRegisterFiles('registerStep2'); 
var tempInterval = setInterval(function() { 

    if(registerStep1 != null && registerStep1 != false) { 
     if(registerStep2 != null && registerStep2 != false) { 
      clearInterval(tempInterval); 
      placeData(registerStep1); 
     } 
    } 
}, 100); 
function placeData(registerData) { 
    var tempTimer = 0; 
    tempTimer = setInterval(function() { 
     if(controlTimeUp != false) { 
      $('#pageWrap').html(registerData); 
      methodToFixLayout(); 
      $('#pageWrap').fadeIn("slow"); 
      $('#pageLoading').css("display","none") 
      clearInterval(tempTimer); 
     } 
    }, 10) 
} 
+0

'/ ..'는'/'는 루트를 의미하고'.. '는 레벨을 의미하기 때문에 경로 시작 부분에서 유효하지 않습니다. 당신은'./ .. '을 의미 할 수도 있습니다. 그러나 그것은'..'로 단순화 될 수 있습니다. – Basic

+0

@Basic - 고마워, 나는 그것도 생각했다. 사실 cakephp를 사용하고 있다면 사실일까요? – Chris

+1

그럴 수도 있습니다. 저는 케이크를 특별히 사용하지 않았지만 많은 프레임 워크가 기본 URL 재 작성 기술을 구현합니다. 이것들 중 하나일지도 모릅니다. 여기에 누군가가 아마 말할 수 있습니다 – Basic

답변

2

:

function getRegisterFiles(name) { 
    var request = $.ajax({ 
     url: "/../files/Users/"+name+".ctp", 
     type: "GET", 
     dataType: "html", 
     error: function(jqXHR, textStatus) { 
      $('#pageLoading p').html('We have experienced a problem. Please try again later.'); 
      return false; 
     }, 
     success: function(msg) { 
      return msg; 
     } 
    }); 
} 

그건이 여기에 정의 된 방법이다. AJAX 호출은 호출자에게 값을 반환 할 수 없습니다. 이는 AJAX가 비동기식이기 때문입니다. (이것은 AJAX의 첫 번째 'A'가 의미하는 것입니다.) getRegisterFiles('register1')에 대한 전화는 즉시 반환됩니다. 서버를 차단하고 응답을 기다리지 않습니다. 따라서 서버의 응답과 관련된 값을 반환 할 수 없습니다. 더 설명을 추가하는 업데이트 Are AJAX calls not blocking and what is their lifespan?

:

이,이 예제를 관찰 Firefox 용 FireBug 확장을 설치 또는 크롬을 사용하려면

다음은 AJAX 요청의 비동기 특성에 관한 또 다른 StackOverflow의 질문입니다. FireBug 또는 Developer Tools를 각각 열고 콘솔 탭을보십시오.

나는 당신의 코드를 가져 와서 많은 로그 메시지를 추가하여 실행 순서를 나타냈다.

console.log('Defining function getRegisterFiles()'); 
function getRegisterFiles(name) { 
    console.log('enter: getRegisterFiles()'); 
    var request = $.ajax({ 
     url: "/../files/Users/"+name+".ctp", 
     type: "GET", 
     dataType: "html" 
    }); 
    console.log("configuring failure handler"); 
    request.fail(function(jqXHR, textStatus) { 
     console.log('enter: failure callback function'); 
     $('#pageLoading p').html('We have experienced a problem. Please try again later.'); 
     console.log('exiting: failure callback function'); 
     return false; 
    }); 
    console.log("configuring success handler"); 
    request.success(function(msg) { 
     console.log('enter: success callback function'); 
     placeData(msg); 
     console.log('exiting: success callback function'); 
     return msg; 
    }); 
    console.log('exiting: getRegisterFiles()'); 
    return "This is the return value of getRegisterFiles()"; 
} 

console.log("defining placeData() function'); 
function placeData(registerData) { 
    console.log('enter: placeData(); registerData="+registerData); 
    $('#pageWrap').html(registerData); 
    console.log('exiting: placeData()'); 
} 

console.log("calling getRegisterFiles()'); 

var result = getRegisterFiles('regster1') 
console.log("getRegisterFiles() finished; result="+result); 

로그 메시지 시퀀스는 실행 순서를보다 명확하게해야합니다. getRegisterFiles()으로 전화를 걸 때 일부 매개 변수를 구성하고 요청을 시작합니다.그러면 함수가 반환됩니다. 아직 서버에서 응답이 없으므로 아직 응답 할 수 없습니다. 이것은 "getRegisterFiles() finished"가 포함 된 로그 메시지에 표시됩니다. 얼마 후 서버로부터 응답이 수신됩니다. 이때 jQuery는 성공한 핸들러로 등록한 함수를 호출한다. 기술적으로 함수에서 값을 반환 할 수는 있지만 jQuery가 호출 한 이후 리턴 값은 jQuery로 반환되어 무시됩니다. 여기

는 귀하의 의견에 따라, 할당을 사용하는 또 다른 변형 :

var dataFromTheServer = "An initial value"; 

console.log('Defining function getRegisterFiles()'); 
function getRegisterFiles(name) { 
    console.log('enter: getRegisterFiles()'); 
    var request = $.ajax({ 
     url: "/../files/Users/"+name+".ctp", 
     type: "GET", 
     dataType: "html" 
    }); 
    console.log("configuring failure handler"); 
    request.fail(function(jqXHR, textStatus) { 
     console.log('enter: failure callback function'); 
     $('#pageLoading p').html('We have experienced a problem. Please try again later.'); 
     console.log('exiting: failure callback function'); 
     return false; 
    }); 
    console.log("configuring success handler"); 
    request.success(function(msg) { 
     console.log('enter: success callback function'); 
     dataFromTheServer = msg; 
     console.log('exiting: success callback function'); 
    }); 
    console.log('exiting: getRegisterFiles()'); 
    return "This is the return value of getRegisterFiles()"; 
} 

console.log("defining placeData() function'); 
function placeData(registerData) { 
    console.log('enter: placeData(); registerData="+registerData); 
    $('#pageWrap').html(registerData); 
    console.log('exiting: placeData()'); 
} 

console.log("calling getRegisterFiles()'); 

getRegisterFiles('regster1') 
console.log("getRegisterFiles() finished; dataFromTheServer="+dataFromTheServer); 
placeData(dataFromTheServer); 

서버가 응답하기 전에 placeData()가 (긴) 호출되기 때문에 의도 한대로이 작동하지 않는 이유는 요청이 없으므로 과제가 아직 발생하지 않았습니다. 결국 응답이 수신되면 할당이 발생하지만 그 시점에 함수가 호출되지 않으므로 해당 값은 아무 것도 수행되지 않습니다.

또한 글로벌 이름 지정에 대한 할당 사용을 권장하지 않습니다. 전역 변수를 사용하는 것보다 변화하는 요구를 충족시키기 위해 소프트웨어 프로젝트가 수정되므로 로컬 변수를 사용하면 디버그가 쉬우 며 정확성을 쉽게 확인하고 코드를 재사용하기 쉽습니다.

+0

답장을 보내 주셔서 감사합니다. - 다른 방법으로 어떻게 처리할까요? 나는 성공 부분 내부에서 함수를 호출하는 이유는 이해가 안가지만 내가 시도하고 데이터를 변수에 할당하면 그것을 수신하지 않습니다 – Chris

+0

내가 비동기 성질을 설명하고 할당의 사용에 영향을 미치는 방법에 대한 내 대답을 업데이 트했습니다 콜백 함수에서. – dsh

+0

고마워, 너 내가 고칠 수 있도록 도와 줬어! – Chris

0

어디에서 반품을 시도합니까? 범위 내에 있어야합니다 :

request.success(function(msg) { 
    placeData(msg); 
    return msg; 
}); 

거기서 벗어난 경우 작동하지 않으면 정의되지 않습니다.

둘째, 그렇지 않으면 다른 플러그인을 사용하고 있는지 모르겠지만 어쩌면 이처럼 성공/실패를 처리해야합니까? 당신은 제대로하고있는 http://api.jquery.com/jQuery.ajax/

+1

고마워, 내가 제안한 방식대로 코드를 변경했습니다. 반환 메시지는 다른 기능과 동일한 위치, 즉 동일한 범위로 데이터를 반환하지만 작동하지 않습니다. – Chris

관련 문제