我对承诺有一个小问题。我确定运行循环允许解决我的问题,但它仍然有点模糊我。问题在这里:我有一个组件可以执行一些重的ajax调用,可能需要几秒钟才能完成。当promises解决时,我将数据设置为componnent,以便它可以从中呈现图形。问题是,如果在此期间,用户转换到新页面,则视图(和所有组件)将被销毁,并且当promises解析时,它会尝试设置为尚不存在的对象。繁荣,我有一个“试图设置被破坏的对象错误”。这是在promise解析时调用的方法的一小部分:
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);
});
},
非常感谢!
答案 0 :(得分:1)
问题提出已近2年了;但是那天以来发生了很多变化。我只想发一个答案,以便将来看到这个问题的任何人都知道这不再是问题了。
有一个很棒的插件可以用来准确地解决这个问题中提到的那类问题。 ember-concurrency提供了可取消的承诺。 Official documentation页明确地对此问题中总结的案例进行了如下处理:
“ember-concurrency使您能够编写任务,这些操作是绑定到它们所在对象生命周期的异步可取消操作,这意味着当主机对象被销毁时(例如组件未被渲染),任务自动取消。“