Ember.js:如何防止这个属性观察者被多次击中?

Ember.js:如何防止这个属性观察者被多次击中?,ember.js,ember-data,Ember.js,Ember Data,在我的控制器中,我有一个属性和一个观察该属性的函数。当属性更改一次时,观察者将被击中三次——两次是旧数据,一次是新数据。您可以在我刚刚创建的jsbin的控制台窗口中看到这种情况: 用法:单击其中一本而不是第一本,然后在控制台窗口中查看结果 在我的实际应用程序中,要执行的工作需要异步下载。由于三次点击,该观察者下载了两次错误内容和一次正确内容。使这个问题更加明显的是,异步响应不会按顺序返回: 一个临时解决方案是将下载代码安排在以后运行。我不确定为什么会发生这种情况,但给出了一种解决方法。他们建议如

在我的控制器中,我有一个属性和一个观察该属性的函数。当属性更改一次时,观察者将被击中三次——两次是旧数据,一次是新数据。您可以在我刚刚创建的jsbin的控制台窗口中看到这种情况:

用法:单击其中一本而不是第一本,然后在控制台窗口中查看结果

在我的实际应用程序中,要执行的工作需要异步下载。由于三次点击,该观察者下载了两次错误内容和一次正确内容。使这个问题更加明显的是,异步响应不会按顺序返回:

一个临时解决方案是将下载代码安排在以后运行。

我不确定为什么会发生这种情况,但给出了一种解决方法。他们建议如下:

bookObserver: function() {
    Ember.run.once(this, 'bookWasChanged');
}.observes('book'),

bookWasChanged: function() {
    // This will only run once per run loop
}
就我个人而言,我总是假设观察员可以开火,即使我不希望他们开火。例如,使用此代码,我将执行以下操作:

bookObserver: function() {
    var book = this.get('book');
    var lastBook = this.get('lastBook');

    if (book !== lastBook) {
        this.set('lastBook', book);
        doSomethingWithBook(book);
    }
}.observes('book')

这样,即使Ember给你的观察者打了1000次电话,你也只能在书实际发生变化时做你想做的工作。

这个跑步者比Ember.run.later更适合我。非常感谢。