2013-06-12 4 views
1

I 폰갭 API를 사용하여 ST /의 ExtJS 다음 코드 믹스를 가지고 있지만, 이것은 일반적인 자바 스크립트 질문 :JS 콜백 체인 혼란

내 양식에 저장 버튼 내가이 메소드를 호출 도청 :

onSavePush: function(button) { 
    var form = button.up('panel'), 
    //get the record 
     record = form.getRecord(), 
    //get the form values 
     values = form.getValues(); 
    //if a new push 
    if(!record){ 
     var newRecord = new EvaluateIt.model.SiteEvaluation(values); 
     Ext.getStore('SiteEvaluations').add(newRecord); 
    } 
    //existing push 
    else { 
     record.set(values); 
    } 
     form.hide(); 
    // assemble record 
    //assemble_evaluation(record); 

    initialize_image_post(record, values); 

    // add file_name update to store here: 

}, 

함수 initialize_image_post는()가 말하는 않습니다 (API URL을 설정하고 URI 참조를 잡고) :

function initialize_image_post(record) { 

    var uri, 
     url; 

    // use new API with authorization token 
    url = EvaluateIt.config.protocol; 
    url += EvaluateIt.config.test; 
    url += EvaluateIt.config.domain; 
    // url += EvaluateIt.config.dev; // ev environment 
    // url += EvaluateIt.config.file_response; // needed for POST echo 
    url += EvaluateIt.config.apiViewNomination; 
    url += EvaluateIt.config.file_upload; 
    url += '?token=' + sessionStorage.sessionToken; 

    uri = record.data.imageUri; // local path to image 

    console.log('uri: ' + uri + 'url: ' + url); 

    post_image(uri, url); 
} 

을 그런 다음 함수 post_image에서 폰갭 파일 전송 API를 호출()

// Phonegap file transfer 
function post_image(imageUri, url) { 
    var options = new FileUploadOptions(), 
     ft = new FileTransfer(); 

    options.fileKey = 'userfile'; 
    //options.fileName = imageUri.substr(imageUri.lastIndexOf('/') + 1); 
    options.mimeType = 'image/jpeg'; 
    options.chunkedMode = false; 

    ft.upload(imageUri, encodeURI(url), post_success, post_error, options); 
} 

성공, I는 서버의 응답을 잡고 내가 돌아 오는 길에 내 초기 방법에 문제가

function post_success(r) { 
    console.log("Code = " + r.responseCode); 
    console.log("Response = " + r.response); 
    console.log("Sent = " + r.bytesSent); 
    alert(r.response); 

    var response = Ext.JSON.decode(r.response), 
     file_name = response.imageData.file_name; 

    alert(file_name); 

    // somehow get file_name back up to onSavePush method 

} 

내 로컬 데이터 저장소에 쓸 수 있도록 FILE_NAME을 잡을 이렇게하려면 응답 변수를 다시 onSavePush 메서드에 전달해야합니다. 어떻게해야합니까? 어떻게 든 콜백 체인이나 그런 것들을 설정해야한다고 생각합니까? 그레지!

답변

1

onSavePush 방법으로 응답을 받고 싶습니다. 맞습니까? 당신은 이미지, 화재 이벤트를 게시 신경 것 클래스/싱글을 설계 할 수

onSavePush: function(button) { 
    // bablabla 
    var post_success = function(r) { 
     // bablabla or "add file_name update to store here" 
    } 
    initialize_image_post(record, values, post_success); 
} 

function initialize_image_post(record, values, callback) { 
    // bablabla 
    post_image(uri, url, callback); 
} 

function post_image(imageUri, url, post_success) { 
    // bablabla 
    ft.upload(imageUri, encodeURI(url), post_success, post_error, options); 
} 

을 이상적으로 : 그런 다음 절차 스타일의 프로그래밍 솔루션은 onSavePushpost_success 콜백을 정의하고 그것을 아래로 전달하는 것입니다 성공하면 일회용 이벤트 처리기를 onSavePush에 첨부 할 수 있습니다.

+0

Danke Schoen! 그것은 저를 위해 작동합니다 (나는 해결책이 명백하다는 것을 알았습니다!)! 그리고 네, 내 onSavePush 메서드에서 응답이 필요한 이유가 있습니다. 절차 적 솔루션이 마음에 들지는 않지만 내 앱의 프로토 타입을 빨리 꺼내는 것은 빠르고 간결한 방법 인 것으로 보입니다. 나는 길 아래로 싱글 톤을 시도 할 것이다. –