无法使用promise获取bind()的正确上下文

时间:2014-06-16 14:40:14

标签: javascript ajax oop requirejs promise

我无法使用bind()在我的一个内部函数中获取正确的上下文。这是我的代码:

return {
    /**
     * Checks if the table loader is active
     * @return {home} Returns this module for chaining
     */
    loadStatusLog: function() {
        if ($("#status-log-box").length) {
            $.getJSON("/Home/CurrentEvents", function(json, status, xhr) {
                if (status === "error") {
                    var errmsg = "Sorry but there was an error: ";
                    $("#result-msg").html(errmsg + xhr.status + " " + xhr.statusText);
                }
                else if (status === "success") {
                    if (json.globalGenerationStatus) {
                        console.log(this);
                        this.updateProgressInterval = setInterval(this.updateGenerationProgress, 1000);
                    }
                    var html = statusLog(json);
                    $("#status-log-table").html(html);
                }
            }.bind(this));
        }
        return this;
    },
    /**
     * Looks at the generation progress file and updates the progress bar for a running event
     * @returns {home} Returns this module for chaining
     */
    updateGenerationProgress: function() {
        var runningEvent = $(".running-event");
        $.ajax({
            type: "POST",
            url: "/Home/readGenerationStatusFile",
            global: false
        }).done(function(data) {
            runningEvent.css("width", data + "%").attr("aria-valuenow", data);
            if (data === "100") {
                console.log(this);
                clearInterval(this.updateProgressInterval);
                $("span", runningEvent).text("Complete").parent().removeClass("running-event").parent().removeClass("active progress-striped");
            }
        }.bind(this));
        return this;
    }

};

我的主要目标是清除loadStatusLog()函数中updateGenerationProgress()函数内部设置的区间。 console.log()内的loadStatusLog()语句输出正确的上下文(此对象),但console.log()内的updateGenerationProgress()语句输出Window作为上下文。为什么是这样?对于承诺和背景,我有什么遗漏吗?

1 个答案:

答案 0 :(得分:1)

您还需要在间隔上设置上下文

this.updateProgressInterval = 
    setInterval(this.updateGenerationProgress.bind(this), 1000);

否则,那里的上下文在非严格模式下设置为window(或者工作者),在严格模式下设置为undefined