我有一个js对象,我有一个方法调用另一个方法并返回一个promise,但是从.then()内部我无法访问成员函数foo()。为什么我不能访问foo()以及如何访问它?这是我的代码:
function LoadImageGroupFormat() {
return new Promise(function(resolve, reject) {
var xhttp = new XMLHttpRequest();
xhttp.open('GET', "imagegroup_format.txt");
xhttp.onload = function() {
if (xhttp.status == 200) resolve(xhttp.responseText);
else reject(Error(xhttp.statusText));
};
xhttp.onerror = function() {
reject(Error("Network Error"));
};
xhttp.send();
});
}
//the object
var Registerhandler = {
imageGroupIndex: 0,
foo: function() {
//Do something else here
},
GetImageGroupFormat: function() {
var imageGroupIndex = this.imageGroupIndex;
LoadImageGroupFormat().then(function(ImageGroup_Format) {
//Do something with ImageGroup_Format
imageGroupIndex++; //This works
foo(); //Doesn't work - undefined
}, function(error) {
console.error("Failed to Load ImageGroup Format", error);
});
}
}
感谢您提供任何帮助。
答案 0 :(得分:1)
foo
是一个属性,而不是函数/变量名,您需要使用属性语法来调用它。由于this
没有保存在闭包中,因此您需要定义一个本地闭包变量来保存它。
您还需要使用self.imageGroupIndex
来更新该属性,否则您需要递增该值的副本。
var Registerhandler = {
imageGroupIndex: 0,
foo: function() {
//Do something else here
},
GetImageGroupFormat: function() {
var self = this;
LoadImageGroupFormat().then(function(ImageGroup_Format) {
//Do something with ImageGroup_Format
self.imageGroupIndex++;
self.foo();
}, function(error) {
console.error("Failed to Load ImageGroup Format", error);
});
}
}
答案 1 :(得分:1)
使用Function.prototype.bind()
, bind()
方法会创建一个新功能,在调用时,将 this
关键字设置为提供的值,在调用新函数时,在任何提供的参数序列之前使用给定的参数序列。
function LoadImageGroupFormat() {
return new Promise(function(resolve, reject) {
resolve('success!'); //updated fro demonstration purpose
});
}
var Registerhandler = {
imageGroupIndex: 0,
foo: function() {
alert('In foo!');
},
GetImageGroupFormat: function() {
var imageGroupIndex = this.imageGroupIndex;
LoadImageGroupFormat().then(function(ImageGroup_Format) {
console.log(ImageGroup_Format);
this.imageGroupIndex++;
this.foo();
}.bind(this), function(error) {
console.error("Failed to Load ImageGroup Format", error);
});
}
}
Registerhandler.GetImageGroupFormat();