我正在尝试编写一个包含许多属性和方法的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());
});
然后它工作但仍然有两个问题
感谢。
答案 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());
});