【问题标题】:Two callback functions are being executed in custom AJAX function自定义 AJAX 函数中正在执行两个回调函数
【发布时间】:2016-06-24 02:02:33
【问题描述】:

我在 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();
}

【问题讨论】:

  • console.log(e) 显示什么?
  • 没有记录错误。

标签: javascript json ajax xmlhttprequest


【解决方案1】:

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

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

【讨论】:

  • 哇,谢谢。你能详细解释一下吗? awwaww() 有什么区别
  • 在函数名后加括号是调用函数的方式。因此,您正在调用函数aww,并将其返回值作为参数传递给get()。您只想传递函数本身,以便get() 在检测到错误时调用它。
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2021-10-17
相关资源
最近更新 更多