如何抑制未捕获错误:在状态root.loaded.updated.inFlight中尝试在App.Model上处理事件`willSetProperty`?

时间:2014-01-09 07:39:30

标签: javascript ember.js

我正在使用Ember.js和Rails构建播客监听应用程序。

我的Episode模型有一个属性current_position,用于在UI中显示剧集的当前收听位置,并在刷新页面时从其最后位置恢复剧集。 / p>

我从audio元素更新每个current_position事件的durrationchange,但我不想每次都将更改保存到服务器,所以我使用Ember.run.throttle来将呼叫限制为每十秒保存一次。

durrationchange事件发生的速度比我的服务器响应保存请求的速度快,因此模型上调用set会引发错误,因为模型已标记为inFlight

我想到了两种抑制错误的方法:捕获它,或者仅在isSaving为假时更新模型。

捕获错误似乎更可取,因为在isSaving为真时跳过更新可能会导致进度条断断续续,尤其是在服务器停机或运行缓慢的情况下。

我听说捕捉错误很贵,这是真的吗?是否有一种方法可以保存模型并立即将其标记为干净,而无需等待服务器响应?

编辑:我已经添加了代码。

App.Episode = DS.Model.extend
  episode_data:     DS.belongsTo 'App.EpisodeData', async: true

  current_position: ( (key, current_position) ->
    # Setter
    if (current_position != undefined)
      return this.create_or_update_episode_data(key, current_position)
    # Getter
    else
      return this.get('episode_data.current_position') || 0
  ).property('episode_data.current_position')

  create_or_update_episode_data: (key, value) ->
    episode_data = this.get('episode_data')

    # Create episode_data if it doesn't exist
    unless episode_data
      episode_data = Buzz.EpisodeData.createRecord(episode: this)

    episode_data.set(key, value)
    Ember.run.throttle this, 'save_episode_data', 10000

    return episode_data.get(key)

  # I think Ember.run.throttle can only be called on named functions,
  # which is why this exists.
  save_episode_data: () ->
    this.get('episode_data').save()

第一次调用episode.set('current_position', current_position) <{1}}的{​​{1}}将被创建或更新,然后保存。

如果在10秒内再次呼叫,episode将会更新,但不会保存,因为episode_data会阻止对current_position的呼叫。如果在服务器响应第一次呼叫Ember.run.throttle之前发生第二次呼叫,则会导致错误。

0 个答案:

没有答案