我正在使用jQuery的getJSON方法。由于它是异步的,我在调用它的函数上使用when方法来知道何时可以运行我的下一个函数。下一个功能是使用把手模板创建表。我知道什么时候工作,因为创建了模板但是我没有得到所需的数据。
当使用console.log时,我看到附加到此的数组,但是如果我说this.objName则是未定义的。承诺/延期只是说请求成功了吗?有没有一种方法可以让我等待/观察数据?
(function () {
"use strict";
var TicketQueue = {
init: function (config) {
this.url = config.data;
this.template = config.template;
this.container = config.container;
$.when(this.fetch()).done(this.attachTemplate());
},
attachTemplate: function () {
var template = Handlebars.compile(this.template);
this.container.append(template(this.tickets));
},
fetch: function () {
var self = this;
$.getJSON(this.url, function (data) {
self.tickets = $.map(data.tickets, function (ticket) {
return ticket;
});
//self.attachTemplate();
});
}
};
TicketQueue.init({
template: $('#ticketQueueTpl').html(),
container: $("table.ticketQueue"),
data: "db/tickets.json"
});
}());
我有一个评论self.attacheTemplate,它确实有效,但我试图让这个函数只是fetch和init初始化我的所有代码。
答案 0 :(得分:1)
$.when()
期望Deferred作为参数,否则它会立即解决。由于您没有从this.fetch()
返回AJAX承诺,因此展示了后一种行为。 从this.fetch()
返回 AJAX来电。
fetch: function () {
var self = this;
return $.getJSON(this.url, function (data) {
self.tickets = $.map(data.tickets, function (ticket) {
return ticket;
});
//self.attachTemplate();
});
}
您将this.attachTemplate()
的结果传递给then()
,而不是函数本身。你想要做;
$.when(this.fetch()).done(function () {
this.attachTemplate()
}.bind(this));
注意我在那里多加了bind()
;那是因为this
的值在我们正在使用的匿名函数中丢失了。
说完所有这些之后,你甚至不需要$.when()
; $.when()
适用于将多个Deferred组合成一个Deferred。只需使用;
this.fetch().done(function () {
this.attachTemplate();
}.bind(this));