我刚开始用javascript创建自定义对象。我想使用下面的代码设置this.someObjVar
,但是我的方法出了问题。也许异步响应使用它自己的作用域或线程。如何从异步回调中设置对象变量
// The code below used like:
someClass = new extfoo.SomeClass();
someClass.loadArrFromFile();
// this will be called far later after async returns
someClass.showSomeObjVar();
extfoo.js
=========
var extfoo = {};
extfoo.SomeClass = function() {
this.someObjVar = [];
this.showSomeObjVar = extfoo.showSomeObjVar;
this.loadArrFromFile = extfoo.loadArrFromFile;
};
// Bad results here
extfoo.showSomeObjVar = function() {
// results '0'
console.log('showSomeObjVar: ' + this.someObjVar.length);
};
// Async array population
extfoo.loadArrFromFile = function() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
this.someObjVar = xhr.responseText.split('\r\n')
// results '23' elements
console.log("someObjVar length: "+this.someObjVar.length);
}
}
// request code ...
};
是''loadArrFromFile'的SomeClass.prototype'一员?顶部的代码表明它是,但我看到的唯一任务是'extfoo.loadArrFromFile'。同时请记住,'this'的值将在'xhr.onreadystatechange'回调中发生变化,因此'this.someObjVar = xhr.resp ...'不会与直接位于'loadArrFromFile '功能。 – 2012-03-08 15:02:51