我正在使用jQuery创建一个ajax包装器,但是我在正确处理范围时遇到了一些问题。 (代码缩短了可读性)
我有一个我想在beforeSend事件中使用的实用程序类,但它目前尚未定义。我尝试使用call()方法向下传递范围,但这并没有改变任何东西。
我怎么能实现这个目标?
class AjaxHelper{
private _utils: Utilities;
AjaxCall(options: AjaxHelperOptions)
{
this._utils = new Utilities();
var defaults: AjaxHelperOptions = { ... };
var settings: AjaxHelperOptions = $.extend({}, defaults, options);
var deferred = $.Deferred.call(this, function (d) {
d.done(settings.success);
d.fail(settings.error);
d.done(settings.complete);
var jqXHRSettings = $.extend.call(this, {}, settings, {
beforeSend: function (jqXHR, settings) {
______________________________________
this._utils.CallSomeUtilityFunction();
______________________________________
d.resolve;
}
.......................
$.ajax.call(this, jqXHRSettings);
});
var promise: JQueryPromise = deferred.promise();
promise.done = deferred.done;
promise.fail = deferred.fail;
return promise;
}
}
答案 0 :(得分:1)
您需要在整个链中维护函数this
范围:
var deferred = $.Deferred.call(this, (d) => { // this line
d.done(settings.success);
d.fail(settings.error);
d.done(settings.complete);
var jqXHRSettings = $.extend.call(this, {}, settings, {
beforeSend: (jqXHR, settings) => { // AND this line
______________________________________
this._utils.CallSomeUtilityFunction();
______________________________________
d.resolve;
}
.......................
$.ajax.call(this, jqXHRSettings);
});
答案 1 :(得分:0)
尝试使用这样的lambda函数:
beforeSend: (jqXHR, settings) => {
this._utils.CallSomeUtilityFunction();
d.resolve;
}