AJAX和JavaScript对象中的问题

时间:2014-02-01 15:00:26

标签: javascript jquery ajax

我正在尝试编写一个包含许多属性和方法的JavaScript对象。此代码的基本功能是发送ajax调用并从服务器获取数据。 代码IS:

function restClient(options) {
    var _response;
    var _response_status;
    var _response_message;
    var _response_data;

    // Default Options
    var _default = {
        restCall: true,
        type: "GET",
        url: '',
        contentType: "application/json; charset=utf-8",
        crossDomain: false,
        cache: false,
        dataType: 'json',
        data: {},
        beforeSend: _ajaxBeforeSend,
        success: _ajaxSuccess,
        error: _ajaxError,
        complete: _ajaxComplete
    };

    // Extend default Options by User Options
    var ajaxOptions = $.extend(_default, options);

    // Private Methods
    function _ajaxBeforeSend() {

    }
    function _ajaxSuccess(response) {
        _response = response;
        _response_status = response.status;
        _response_message = response.message;
        _response_data = response.data;
    }
    function _ajaxError(xhr, status, error) {
        _response_status = xhr.status;
        _response_message = error;
    }

    function _ajaxComplete(xhr, status) {

    }

    // Send Ajax Request
    this.sendRequest = function() {
        $.ajax(ajaxOptions);
    };


    // Get Server Response Pack [status,message,data]
    this.getResponse = function() {
        return _response;
    };

    // Get Server Response Status: 200, 400, 401 etc
    this.getStatus = function() {
        return _response_status;
    };

    // Get Server Message
    this.getMessage = function() {
        return _response_message;
    };

    // Get Server Return Data
    this.getData = function() {
        return _response_data;
    };
}

现在我尝试使用new运算符创建对象并调用sendRequest();发送ajax调用然后我调用getResponse()的方法;获得服务器响应,如:

var REST = new restClient(options);
REST.sendRequest();
console.log(REST.getResponse());

每件事情都正常但问题是REST.getResponse();之前调用完成Ajax,这给了我空的结果。如果我喜欢这个

$(document).ajaxComplete(function(){
        console.log(REST.getResponse());
    });

然后它工作但仍然有两个问题

  1. 如果还有另一个ajax调用,它也会等待
  2. 看起来很糟糕我想隐藏这个ajaxComplete()一些在restClient()中的位置; 请帮助我。
  3. 感谢。

1 个答案:

答案 0 :(得分:3)

您必须更改方法sendRequest以接受回复,您将在响应完成时调用。

this.sendRequest = function(cb) {
    this.cb = cb; 
    $.ajax(ajaxOptions);
};

this._ajaxComplete = function(xhr, status) {
    this.cb && this.cb();
}

此外,在定义this._ajaxComplete更改_default.complete处理程序后,为了绑定this对象,否则您将错过cb属性:

_default.complete = this._ajaxComplete.bind(this);

您的客户端代码将变为:

var REST = new restClient(options);
REST.sendRequest(function(){
    console.log(REST.getResponse());
});