在自定义AJAX函数中正在执行两个回调函数

时间:2016-06-23 17:52:59

标签: javascript json ajax xmlhttprequest

我在javascript中创建了一个自定义GETPOST函数来处理我的AJAX请求。当我尝试拨打电话时,首先执行fail回调,然后执行done回调。 AJAX的响应是一个有效的JSON字符串,我不明白为什么会发生这种情况。如果响应是有效的JSON,则只能执行done回调。

get('ajax/autocomplete.php', {q: q}, function(data) {
    //done, executed second
}, aww());//Error, executed first

function get() {
    var data,
        done,
        fail,
        done_index = null,
        str = '',
        ajax = new XMLHttpRequest(),
        url = arguments[0];

    for(var i=0; i<arguments.length; i++) {
        if(typeof arguments[i] == 'object') {
            data = arguments[i];

            for(var key in data) {
                if(str != "") str += "&";

                str += key + "=" + encodeURIComponent(data[key]);
            }

            if(str != '') url += '?';
        } else if(typeof arguments[i] == 'function') {
            if(!done_index) {
                done = arguments[i];
                done_index = i;
            }

            if(i != done_index) {
                fail = arguments[i];
            }
        }
    }

    ajax.onreadystatechange = function() {
        console.log(ajax.readyState, ajax.status);

        if(ajax.readyState === XMLHttpRequest.DONE && ajax.status === 200) {
            var response = ajax.responseText;//treat empty response as valid JSON
            if(response.length == 0) response = '""';

            try {
                var json = JSON.parse(response);
                return (done) ? done(json) : false;
            } catch(e) {
                console.log(e);
                return (fail) ? fail() : false;
            }
        }
    };

    ajax.open('get', url + str);
    ajax.send();
}

1 个答案:

答案 0 :(得分:1)

您正在将参数列表中的aww()函数调用到get(),因为后面有括号。您应该只传递对该函数的引用。它应该是:

get('ajax/autocomplete.php', {q: q}, function(data) {
}, aww);