控制台中的非确定性Backbone Collection属性赋值

时间:2012-02-08 12:41:18

标签: javascript firefox google-chrome console backbone.js

我正在构建一个Backbone应用程序,我正在观察一些我无法放置的行为。请考虑以下集合:

window.Pictures = Backbone.Collection.extend({
  model: Picture,
  url: 'latest.json',
  parse: function(response) {
    this.foobar = 1;
  },  
  fetchPage: function() {
    this.foobar = 2;
    return this;
  }
});

在Chrome(或Firefox)控制台上,我发出了以下命令:

> p = new Pictures(); p.fetch(); p.fetchPage();
> p.foobar
1

当我这样做时:

> p = new Pictures(); p.fetch()
> p.fetchPage();
> p.foobar
2

我真的不明白这一点。为什么第一次执行与第二次执行不同?

1 个答案:

答案 0 :(得分:1)

fetch调用是异步的,因为它涉及对服务器的AJAX调用:

  

获取 collection.fetch([options])
  从服务器获取此集合的默认模型集,在集合到达时重置集合。

fetch会致电parse

  

解析 collection.parse(响应)
  只要服务器在fetch中返回集合的模型,Backbone就会调用解析

因此p.parse()可能会在p.fetchPage()之前或之后被调用,具体取决于您无法控制的时间问题。

在第一种情况下:

> p = new Pictures(); p.fetch(); p.fetchPage();

fetchPagefetch从服务器获得响应之前被调用,并且可以调用parse,因此调用序列最终会像这样结束:

  1. 您致电p.fetch()
  2. 进行了AJAX调用。
  3. 您致电p.fetchPage()
  4. 收到AJAX回复。
  5. AJAX成功处理程序调用{​​{1}}。
  6. 在第二种情况下:

    p.parse()

    在调用> p = new Pictures(); p.fetch() > p.fetchPage(); 之前,AJAX调用返回的行之间有足够的时间,因此事情按顺序发生,完全是偶然的。

    如果您需要按特定顺序执行某些操作,则需要使用p.fetchPage()提供的success(以及可能的error)回调:

      

    选项哈希需要fetchsuccess个回调,这些回调将作为参数传递error

    所以这应该给你一个2的结果:

    (collection, response)

    当然,如果p = new Pictures(); p.fetch({ success: function(collection, response) { collection.fetchPage(); console.log(collection.foobar); } }); 涉及AJAX调用,那么您必须添加另一层回调以获得一致的fetchPage值。