2013-07-26 2 views
2

나는 정말 이해가 안 :자바 스크립트 AJAX와 콜백

Calendar = function() { 

    this.data; 
    this.init = function(path, callback){ 
     $.ajax({ 
      url:path, 
      type:'GET', 
      success:function(data){ 
       this.data = data; 
       console.log(this.data); 
       callback(); 
      } 
     }) 
    } 

    this.create = function(){ 
     this.generateYear(); 
    } 

    this.generateYear = function(){ 
     console.log(this.data); 
    } 
} 

그리고는 다음과 같이 사용 :

$(document).ready(function(){ 
    var calendar = new Calendar(); 
    calendar.init(path,function(){ 
     calendar.create(); 
    }); 
}); 

그래서 첫 번째 콘솔. 로그는 좋지만 두 번째 것은 정의되지 않았기 때문에, 나는 그가 왜 호출 되었기 때문에 이해하지 못한다. 당신이 아약스에게주는 콜백에서 당신의 도움이

+0

중복 가능성 [AJAX를 호출의 응답을 반환하는 방법?] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an- ajax-call) – elclanrs

+0

@elclanrs –

+0

첫 번째'console.log (this.data); 다음에'callback();'이 무엇입니까? – Paritosh

답변

5

컨텍스트 설정 PARAM로 init 함수. 이 하나를 시도

$.ajax({ 
     url:path, 
     type:'GET', 
     context: this, 
     success:function(data){ 
      this.data = data; 
      console.log(this.data); 
      callback(); 
     } 
    }) 
+0

@MichaelWalter'context'. 그리고 그것은 좋은 대답처럼 보입니다. +1. –

+0

oops. 내 댓글을 삭제했습니다. 답변 주셔서 감사합니다 –

+0

답변 주셔서 감사합니다 Logged – Ajouve

3

this에 대한

덕분에, 일정하지 않습니다.

변경 아약스 기능에

this.init = function(path, callback){ 
    var calendar = this; 
    $.ajax({ 
     url:path, 
     type:'GET', 
     success:function(data){ 
      calendar.data = data; 
      console.log(calendar.data); 
      callback(); 
     } 
    }) 
} 
+0

고맙습니다. 좋은 대답이지만 마이클의 대답을 더 좋아합니다. 이걸 좀 더 알게 되네. – Ajouve

+0

@ant 개인적으로 나는 항상 네이티브 클로저를 염두에 두는 것을 선호한다. 해결책은'ajax' 함수의 모든 매개 변수를 기억하려고 시도하는 것보다 낫습니다. 그러나 그의 대답은 너무 좋았습니다 (나는 그것을지지했습니다). 그래서 당신이 그것을 선택하도록 비난하지 않을 것입니다. 다른 모든 유사한 경우에 사용할 솔루션이므로 내 대답을 이해해야합니다. –

+1

@ dystroy의 대답은 더 읽기 쉽습니다. 'this'를 사용하는 Michael의 대답은 혼란을 일으킬 것입니다. – rab

0

을 this.generateYear 전화 내에서 "이"아니다 더 Calendar 객체를 참조하고 대부분의 아마 속성과 같은 데이터가없는 Window 객체를 참조한다. Javascript binding

개체의 변수에이 인스턴스를 저장하고 나중에 사용하면 효과가 있음을 알 수 있습니다. 예 :

this.init = function(path, callback){ 
    var self = this; 
    $.ajax({ 
     url:path, 
     type:'GET', 
     success:function(data){ 
      self.data = data; 
      console.log(self.data); 
      callback(); 
     } 
    }) 
}