jQuery Promise / Deferred

时间:2014-03-07 20:55:12

标签: jquery handlebars.js

我正在使用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初始化我的所有代码。

1 个答案:

答案 0 :(得分:1)

  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();
        });
    }
    
  2. 您将this.attachTemplate()结果传递给then(),而不是函数本身。你想要做;

    $.when(this.fetch()).done(function () {
        this.attachTemplate()
    }.bind(this));
    

    注意我在那里多加了bind();那是因为this的值在我们正在使用的匿名函数中丢失了。


  3. 说完所有这些之后,你甚至不需要$.when(); $.when()适用于多个Deferred组合成一个Deferred。只需使用;

    this.fetch().done(function () {
        this.attachTemplate();
    }.bind(this));