2014-02-27 4 views
3

약속과 관련된 작은 문제가 있습니다. 나는 실행 루프가 내 문제를 해결할 수 있다고 확신하지만 여전히 너무 조금 애매하다. 문제 : 여기에는 몇 초가 걸릴 수있는 무거운 아약스 호출을 수행하는 구성 요소가 있습니다. 약속이 해결되면 데이터를 그래프로 렌더링 할 수 있도록 데이터를 구성 요소로 설정합니다. 문제는 그동안 사용자가 새 페이지로 이동하면보기 (및 모든 구성 요소)가 파괴되고 약속이 해결되면 아직 존재하지 않는 개체로 설정하려고 시도한다는 것입니다. 그리고 붐, 나는 "파괴 된 개체 오류를 설정하려고 시도했다". 여기에 방법의 작은 부분이라고 그 때 약속 해결 :EmberJS :보기가 삭제 될 때 콜백을 약속 하시겠습니까?

updateChart: function(timeframe, interval) { 
    var self = this; 
    var method = 'get' + this.get('type').capitalize(); 

    this.set('isLoading', true); 

    this.get('slowService')[method](this.get('project')).then(function(result) { 
    Ember.run(function() { 
     self.set('isLoading', false); 
    }); 

    self.set('data', result); 
}); 

},

감사합니다 많이!

+1

최종 Ember.run 내부에서 self.get ("isDestroyed")를 확인하려고합니다. –

+0

감사합니다. 그것은 작동하지만 실제로 데이터와 Ember.run 내부의 체크를 추가해야합니다. 더 좋은 방법이 없을까요? –

답변

1

질문을받은 지 거의 2 년이되었습니다. 하지만 그날 이후로 많은 변화가있었습니다. 나는 지금 질문을 보는 누군가가 이것이 이것이 더 이상 문제가 아니라는 것을 알고 있도록 대답을 게시하고 싶었다.

이 질문에서 언급 된 질문의 유형을 정확히 다루기 위해 사용할 수있는 멋진 애드온이 있습니다. ember-concurrency은 취소 가능한 약정을 제공합니다. Official documentation 페이지는 다음과 같이이 질문에 요약 된 사례를 명시 적으로 나타냅니다.

"에버 동시성을 사용하면 작업 대상을 작성할 수 있습니다. 작업은 비동기식이며 취소 가능한 작업으로 작성한 객체의 수명에 바인딩됩니다. 호스트 객체가 파괴되면 (예 : 구성 요소가 렌더링되지 않음) 작업이 자동으로 취소됩니다. "

관련 문제