Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干中的同时获取()失败_Javascript_Backbone.js_Coffeescript - Fatal编程技术网

Javascript 主干中的同时获取()失败

Javascript 主干中的同时获取()失败,javascript,backbone.js,coffeescript,Javascript,Backbone.js,Coffeescript,我正试图实现一些对主干来说似乎应该相对微不足道的东西,但却不起作用。我正在根据用户的操作用序列填充图形。代码如下 假设用户快速添加了两个系列。或者一条管线同时触发两个序列。常量是在返回第一个fetch之前触发第二个fetch。在这种情况下,“fetching”记录两次,但“fetched”只记录一次。这是预期的行为吗?如果不是,我应该如何构造代码使其工作 # Series model class Series extends Backbone.Model initialize: (opt

我正试图实现一些对主干来说似乎应该相对微不足道的东西,但却不起作用。我正在根据用户的操作用序列填充图形。代码如下

假设用户快速添加了两个系列。或者一条管线同时触发两个序列。常量是在返回第一个fetch之前触发第二个fetch。在这种情况下,“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
将被忽略

演示:

政府这样说:

  • 在向集合中添加重复模型时,主干不再抛出错误,而是将自动跳过它们
因此,如果
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中的
    序列
  • 服务器从第二个AJAX调用返回,并触发成功处理程序
    @series.id
    仍然是2,因此将再次添加3中的
    系列。但是这一个将是重复的,因此
    add
    将忽略您
  • 您应该能够通过为所讨论的系列使用普通的旧局部变量而不是实例变量来解决此问题:

    fetchData: ( opts ) =>
        console.log('fetching')
        series = new Series({ id: opts.id })
        series.fetch
            success: (model, response) =>
                @add(
                    id: series.get('id')
                    #...
                )
    
    你不需要
    中的
    。添加
    ,所以我把它拿了出来。我还在
    @add
    调用中删除了大括号,因为您也不需要它们;你也可以去掉括号,但我把它们留在了里面,因为我发现它们有助于澄清代码的块结构


    首先我应该发现这个问题,对不起。

    向收藏中添加重复模型没有任何作用;特别是,它不会触发
    “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
    将被忽略

    演示:

    政府这样说:

    • 在向集合中添加重复模型时,主干不再抛出错误,而是将自动跳过它们
    因此,如果
    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中的
    序列
  • 服务器从第二个AJAX调用返回,并触发成功处理程序
    @series.id
    仍然是2,因此将再次添加3中的
    系列。但是这一个将是重复的,因此
    add
    将忽略您
  • 您应该能够通过为所讨论的系列使用普通的旧局部变量而不是实例变量来解决此问题:

    fetchData: ( opts ) =>
        console.log('fetching')
        series = new Series({ id: opts.id })
        series.fetch
            success: (model, response) =>
                @add(
                    id: series.get('id')
                    #...
                )
    
    你不需要
    中的
    。添加
    ,所以我把它拿了出来。我还在
    @add
    调用中删除了大括号,因为您也不需要它们;你也可以去掉括号,但我把它们留在了里面,因为我发现它们有助于澄清代码的块结构


    我本来应该首先发现这个问题的,对不起。

    我可能错了,但是你可能会在发布实际javascript时得到更好的响应。。我可能应该学习咖啡剧本,它不会那么难,但我不能不努力地阅读。。8) 对不起,以前是一样的。我非常鼓励你跳起来,特别是如果你在做脊梁骨的事情。这样更好更容易阅读。对我来说,花了一个下午的时间来学习(我绝不是一个l33t js的家伙)。我可能错了,但你可能会得到一个更好的回复发布实际的javascript。。