我正在构建一个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
我真的不明白这一点。为什么第一次执行与第二次执行不同?
答案 0 :(得分:1)
fetch
调用是异步的,因为它涉及对服务器的AJAX调用:
获取 collection.fetch([options])
从服务器获取此集合的默认模型集,在集合到达时重置集合。
fetch
会致电parse
:
解析 collection.parse(响应)
只要服务器在fetch
中返回集合的模型,Backbone就会调用解析。
因此p.parse()
可能会在p.fetchPage()
之前或之后被调用,具体取决于您无法控制的时间问题。
在第一种情况下:
> p = new Pictures(); p.fetch(); p.fetchPage();
fetchPage
在fetch
从服务器获得响应之前被调用,并且可以调用parse
,因此调用序列最终会像这样结束:
p.fetch()
。p.fetchPage()
。在第二种情况下:
p.parse()
在调用> p = new Pictures(); p.fetch()
> p.fetchPage();
之前,AJAX调用返回的行之间有足够的时间,因此事情按顺序发生,完全是偶然的。
如果您需要按特定顺序执行某些操作,则需要使用p.fetchPage()
提供的success
(以及可能的error
)回调:
选项哈希需要
fetch
和success
个回调,这些回调将作为参数传递error
。
所以这应该给你一个2的结果:
(collection, response)
当然,如果p = new Pictures();
p.fetch({
success: function(collection, response) {
collection.fetchPage();
console.log(collection.foobar);
}
});
涉及AJAX调用,那么您必须添加另一层回调以获得一致的fetchPage
值。