我正在使用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
之前发生第二次呼叫,则会导致错误。