主干中的同时 fetch() 失败
Simultaneous fetch() in Backbone failing
我正在尝试实现一些对 Backbone 来说似乎应该相对微不足道的东西,但不起作用。我正在根据用户的操作用系列填充图表。代码如下。
假设用户快速添加了两个系列。或者路由同时触发两个系列。常量是第二个提取在返回第一个读取之前触发。在这种情况下,"fetching"被记录两次,但"fetched"只记录一次。这是预期的行为吗,如果不是,我应该如何构建我的代码才能使其工作?
# Series model
class Series extends Backbone.Model
initialize: (options) ->
_.bindAll @
@endpoint = state?.getEndpoint()
url: ->
[localApiUrl, 'metrics', @endpoint, @.get('id')].join('/')
class SeriesCollection extends Backbone.Collection
model: Series,
initialize: ->
_.bindAll @
@bind 'add', @fetched
fetchData: ( opts ) =>
console.log('fetching')
@series = new Series({ id: opts.id })
@series.fetch
success: (model, response) =>
@.add({
id: @series.get('id')
name: @series.get('id')
data : @series.get('ts')
marker:
radius: 2
turboThreshold: 10000
dataGrouping:
enabled: false
})
fetched: () ->
console.log('fetched', @)
将重复模型添加到集合不会执行任何操作;特别是,它不会触发"add"
事件,因为不会添加任何内容。考虑一下:
# c is an empty collection
c.add(id: 1, t: 'where is')
c.add(id: 2, t: 'pancakes house?')
c.add(id: 1, t: 'different')
这将生成两个"add"
事件,集合最终将以 (1, 'where is')
和 (2, 'pancakes house?')
作为模型,第三个add
将被忽略。
演示:http://jsfiddle.net/ambiguous/WUH6f/
0.9.2 更新日志是这样说的:
- Backbone 现在不会在将重复模型添加到集合时引发错误,而是静默地跳过它们。
因此,如果fetchData
被调用两次,您将收到两个呼叫console.log('fetching')
。但是,如果对fetchData
的两个调用opts.id
相同,则将忽略第二个@add
,因为集合中已经有一个具有id == opts.id
的模型。
你说opts.id
每次都不同,但这并不一定意味着@series.get('id')
会不同。请记住,AJAX 中的 A 代表异步,因此您可能会看到类似于以下内容的事件序列:
- 有些东西叫
fetchData(id: 1)
.@series.id
现在为 1。 - 进行 AJAX 调用。
- 有些东西叫
fetchData(id: 2)
.@series.id
现在将是 2。请记住,@series
是实例变量,而不是局部变量。 - 服务器从第一个 AJAX 调用返回,并触发
success
处理程序。@series.id
现在是 2,将添加 3 中的Series
。 - 服务器从第二个 AJAX 调用返回,并触发成功处理程序。
@series.id
仍然是 2,因此将再次添加 3 中的Series
。但是这个将是重复的,所以add
会忽略你。
您应该能够通过对所讨论的系列使用普通的旧局部变量而不是实例变量来解决此问题:
fetchData: ( opts ) =>
console.log('fetching')
series = new Series({ id: opts.id })
series.fetch
success: (model, response) =>
@add(
id: series.get('id')
#...
)
你不需要@.add
的.
,所以我把它拿出来了。我还在@add
调用中删除了牙套,因为您也不需要它们;你也可以去掉括号,但我把它们留了下来,因为我发现它们有助于澄清代码的块结构。
我应该首先发现这个问题,对不起。
- fetch() 函数未在 Ubuntu Chromium 浏览器上定义
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在Jquery中单击传播失败
- IE11中的第二个调用取消了第一个Fetch API调用
- 网页上失败的javascript会导致所有其他脚本失败
- 带有对象解析的响应javascript ajax失败
- 一台特定计算机的Ajax请求数据未定义/失败
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- jQuery.getJSON失败,语法错误
- ng disabled在放入多个表达式时失败
- Backbone fetch中的Ajax在fetch调用退出后完成,因此fetch调用中没有成功/失败事件
- 主干中的同时 fetch() 失败
- 预检请求失败,并显示 window.fetch api
- Gulp.js安装失败,找不到模块'fetch.js'
- fetch()在Firefox中使用SSL客户端身份验证失败
- Javascript怪异的Fetch()问题,在特定的JSON数据/格式上失败