2014-02-27 34 views
3

我遇到了一个承诺小问题。我确定运行循环允许解决我的问题,但它仍然有点模糊。问题在这里:我有一个组件会执行一些沉重的Ajax调用,可能需要几秒钟才能完成。当承诺解决时,我将数据设置为组件,以便它可以呈现图形。问题是,如果在此期间,用户转换到新页面,则视图(以及所有组件)被销毁,并且在承诺解决时,它会尝试设置一个还不存在的对象。和繁荣,我有一个“试图设置被毁坏的对象错误”。下面是该方法的一小部分被调用的时候,承诺的决心: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

尝试检查self.get(“isDestroyed”)里面的最后Ember.run –

+0

谢谢。它的工作原理,但我实际上需要添加数据和Ember.run内的检查。没有更好的方法吗? –

回答

1

问题提出已有近2年了;但自那一天以来很多变化。我只是想发布一个答案,以便任何人在将来看到这个问题都知道这不再是一个问题。

有一个很棒的插件,可以用来正确处理这个问题中提到的那类问题。 ember-concurrency提供书面可取消承诺。 Official documentation页面明确地注明了此问题中概述的情况如下:

“ember-concurrency使您能够编写Tasks,它们是异步的,可取消的操作,它们与它们所在的对象的生存期绑定,这意味着主机对象被销毁(例如一个组件被解除),任务被自动取消。“