2013-07-20 3 views
-1

JavaScript로 클라이언트 측에서 실행되지만 서버 측에서 파일의 존재를 확인하는 함수를 작성하고 싶습니다. 나는 Ajax를 사용하려고 노력한다.JavaScript에서 서버 측 파일의 존재 확인

function ROIFileExists(){ 
    var fileAlreadyExists=undefined; 

    jQuery.ajax({ 
     type: "POST", 
     url: "ROIFileExists.php", 
     data: { FileName: fileName}, 
     cache: false 
     }).done(function(result) { 
      fileAlreadyExists = (result!==0); 
      console.log('fileAlreadyExists='+fileAlreadyExists); 
    }); 

    return fileAlreadyExists; 
} 

문제 Ajax를 비동기이기 때문에 상기 Ajax를 블록으로 설정되기 전에, fileAlreadyExists 보통 (undefined 같이) 반환되는 점이다.

답변

5

콜백을 사용하거나 자신의 Promise을 사용하십시오.

function ROIFileExists(callback){ 
// --------------------^ Accept the function to call back as an arg 

    jQuery.ajax({ 
     type: "POST", 
     url: "ROIFileExists.php", 
     data: { FileName: fileName}, 
     cache: false 
     }).done(function(result) { 
      var fileAlreadyExists = (result!==0); 
      console.log('fileAlreadyExists='+fileAlreadyExists); 
      callback(fileAlreadyExists); 
// ---------^ Call it 
    }); 
} 

사용법 :

function ROIFileExists(){ 
    var d = new $.Deferred();     // Create the deferred object 

    jQuery.ajax({ 
     type: "POST", 
     url: "ROIFileExists.php", 
     data: { FileName: fileName}, 
     cache: false 
     }).done(function(result) { 
      var fileAlreadyExists = (result!==0); 
      console.log('fileAlreadyExists='+fileAlreadyExists); 
      d.resolve(fileAlreadyExists);  // <=== Resolve it 
    }); 

    return d;         // <=== Return it 
} 

사용법 :

ROIFileExists().done(function(exists) { 
    console.log("Exists? " + exists); 
}); 
여기

ROIFileExists(function(exists) { 
    console.log("Exists? " + exists); 
}); 

Promise 접근 방식 여기

는 콜백 접근법

난 강력하게 async: false를 사용 하지을 제안합니다. 통화 도중 브라우저의 UI가 잠겨 사용자 경험이 좋지 않습니다. jQuery의 향후 버전에서 사라질 것입니다 (직접 XMLHttpRequest을 사용해야합니다). 비슷한 필요성을 가지고 있지만 JSONP를 사용할 때는 async: false을 사용할 수 없습니다.

브라우저의 JavaScript 코드는 어쨌든 이벤트 중심적이므로 이벤트 중심 특성 (이 경우 파일에 대한 정보를 얻는 이벤트)을 사용하는 것이 일반적입니다.

+0

+1 나는'$ .Deferred' 객체에 대해 알지 못했다. – Scott

+1

@ Scott : 네. 언뜻보기에, 그들은 단지 합병증을 추가하는 것처럼 보입니다 (적어도 그것은 첫 반응이었습니다). 그러나 그때 당신이 그들을 결합하기 시작하면, 한 번에 한 가지 이상을 기다리는 것, 그들은 꽤 차가워지기 시작합니다. :-) –

+1

콜백 방식이 효과적입니다! 매우 감사합니다! 나는 약속의 접근 방식을 좋아한다. 다시 한 번 감사드립니다! – OtagoHarbour

2

async: false을 사용하면 결과가 함수에 의해 반환되도록 할 수 있습니다.

function ROIFileExists(){ 
    var fileAlreadyExists=undefined; 

    jQuery.ajax({ 
     async: false, // Add this line 
     type: "POST", 
     url: "ROIFileExists.php", 
     data: { FileName: fileName}, 
     cache: false 
     }).done(function(result) { 
      fileAlreadyExists = (result!==0); 
      console.log('fileAlreadyExists='+fileAlreadyExists); 
    }); 

    return fileAlreadyExists; 
} 

그러나 콜백 함수를 사용하는 것이 가장 좋습니다 : ( async: false가 최적이 아닌, 당신은 콜백을 지원하기 위해 응용 프로그램의 아키텍처를 변경할 수있는 경우 아래에 따라, 피해야합니다.).

function ROIFileExists(callback){ 
    jQuery.ajax({ 
     type: "POST", 
     url: "ROIFileExists.php", 
     data: { FileName: fileName}, 
     cache: false 
     }).done(function(result) { 
      callback(result!==0); 
     }); 
} 
+4

'async : false'는 코드 아키텍처를 변경하여 해결해야하는 문제에 대한 끔찍한 수정입니다. –

+1

그게 효과가! 매우 감사합니다! – OtagoHarbour

+0

@Pekka 웃어 본다. 나는 그 사용법을 용인하지 않는다. 나는 항상 그것을 개인적으로 피할 것이다. 일부 시나리오에서는 아키텍처 변경을 허용하지 않는다고 말하면서 콜백 메소드도 포함 시켰습니다. – Scott

관련 문제