以下是代码的简化版本:
class Service {
static _runRequest = (request, success, failure) => {
request.then(
(response) => {
if (ResponseHelper.wasSuccessful(response)) {
success(response);
}
else if (ResponseHelper.wasUnauthorized(response)) {
SessionHelper.refreshCurrentSession().then(
(refreshResponse) => {
if (refreshResponse === true) {
this._runRequest(request, success, failure);
}
}
);
}
}
);
}
}
问题是,如果会话成功刷新,再次调用_runRequest
时,this
指向全局范围。
任何想法为什么以及如何解决这个问题?无论有多少嵌套函数,this
都不应该保持不变?
答案 0 :(得分:0)
在您的代码中this
将是全局对象或undefined
(取决于严格的设置和环境),与您所处的嵌套级别无关。就像执行时一样静态方法的第一行。
不使用箭头语法定义静态方法,而是使用更成熟,快捷的函数表示法:
static _runRequest(request, success, failure) { // ...etc
这将使this
引用“类”对象。
请参阅下文,比较两种使用Babel定义静态方法的方法,使用简化代码(无嵌套,无承诺):
class Service1 {
static _runRequest = (i) => {
if (i == 0) {
console.log('zero');
return;
}
if (this && '_runRequest' in this) {
return this._runRequest(0); // recurse
}
console.log('this is ' + this);
}
}
Service1._runRequest(1);
class Service2 {
static _runRequest(i) {
if (i == 0) {
console.log('zero');
return;
}
if (this && '_runRequest' in this) {
return this._runRequest(0); // recurse
}
console.log('this is ' + this);
}
}
Service2._runRequest(1);