Javascript对象计数器未按预期递增

时间:2016-02-25 19:44:16

标签: javascript jquery

我无法在代码执行期间使errorCount属性增加。我遇到的问题发生在$.ajax请求中,更具体地说是addError()方法。

如果我使用下面的代码来检查errorCount的当前计数,即使我手动创建了错误,它仍会返回0。但是在调用addError()然后检查errorCount的值之后,在ajax方法内部,它显示1就像它应该的那样。我做错了什么?

var boom = new test(settings, formData, search);
console.log(boom.errorCount);
boom.queueCalls(settings);
console.log(boom);
console.log(boom.errorCount);

这是目标代码:

function test(a, b, c) {
    this.settings = a;
    this.formData = b;
    this.search = c;
    this.errorCount = 0;
}

test.prototype = {
    constructor: test,
    queueEmails:function(settings, formData, search) {
        var url = '/example-url-endpoint';
        var data = {postData: settings + "&" + formData + "&" + search};
        this.sendRequest(url, data);
    },
    queueCalls:function(settings) {
        var url = '/example-url-endpoint2';
        this.sendRequest(url, settings);
    },
    addMessage:function(response) {
        flashMessage(response.Message, response.Result);
    },
    addError:function() {
        this.errorCount++;
    },
    sendRequest:function(url, data) {
        var blah = this;

        j$.ajax({
            type: "POST",
            url: url,
            data: data,
            dataType: 'json',
            success: function(data) {
                response = JSON.parse(data);
                if(response.Result != 'error') {
                    blah.addMessage(response);
                } else {
                    blah.addMessage(response);
                    blah.addError();
                    console.log(blah.errorCount);
                }
            },
            error: function(e, textStatus, errorThrown) {
                blah.addError();
                console.log(blah.errorCount);
                alert("There was an error creating the queue");
            }
        });
    }
}

1 个答案:

答案 0 :(得分:3)

问题是你正在进行异步(AJAX)调用。当你调用queueCalls函数时,它会进行AJAX调用,然后运行你的console.log语句。它不会等到AJAX调用完成,并且您已收到错误以运行控制台语句。如果你想这样做,请查看jQuery documentation for .ajax(),并使你的AJAX调用不是异步,或者将你的控制台语句放在一个.done()事件处理程序中,该事件处理程序将在AJAX调用完成后触发。

enter image description here