私はちょうど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 ...
};
は '' SomeClass.prototype'のloadArrFromFile'メンバーですか?一番上のコードはそれがそうであることを示唆していますが、私が見るのは 'extfoo.loadArrFromFile'だけです。またthis' 'の値は' xhr.onreadystatechange'コールバック内で変更されますので、 'this.someObjVar = xhr.resp ...' 'あなたはloadArrFromFile内で直接持っていることは同じ参照されないことに注意してください'関数。 –