ネストされた匿名の JavaScript メソッド呼び出しのいくつかのレベルの奥深くから、オブジェクト (クラス) レベルで変数値を設定しようとしています。どうすればいいですか?
ここに私がやろうとしていることを説明するコードがあります。免責事項: 私は JavaScript のクロージャの概念にあまり慣れていないため、ここで間違った道を進んでいる可能性があります。私がやりたいことを達成するための簡潔な方法についての提案は大歓迎です。
// FileUtils object.
var FileUtils = function () {
// Member variables.
this.ConfRootDir = null;
};
// Method to get a file entry.
// successCallback has to be a method with a FileEntry object.
FileUtils.prototype.getFileEntry = function (fileName, successCallback) {
if (this.ConfRootDir == null) {
var thisObj = this;
// Request the root filesystem
// [** 1st callback, using anon method]
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0,
function (fileSystem) {
// Get the root directory of the file system.
var rootDir = fileSystem.root;
// Get the ConferenceToGo directory, or create if required.
// [** 2nd callback, using anon method]
rootDir.getDirectory("ConferenceToGo", { create: true, exclusive: false },
function (confDir) {
// Set values for future use
// [** Definitely wrong scoping. The class level variable
// can't be accessed using 'this'. What to do? **]
this.ConfRootDir = confDir;
// Now try getting the handle for the list file.
// [** 3rd callback, using anon method. Irrelevant at this point.]
this.ConfRootDir.getFile(fileName, { create: false },
successCallback, // Success callback [getFile]
function (error) {
logError("Unable to retrieve file: ", true, true, error);
}); // Failure callback [getFile]
}, // Success callback [getDirectory]
function (error) { logError("Unable to create new directory: ", true, true, error); }); // Failure callback [getDirectory]
}, // Success callback [requestFileSystem]
function (error) { logError("Problem reading file system: ", true, true, error); }
);
}
}
上記のコードでは、('this' を使用した) 範囲指定がすべて間違っていることはわかっていますが、それを正しく行う方法がわかりません。コンテキストへのバインドに関するいくつかの回答を見てきましたが (このようなもの)、匿名メソッドを使用しているため、それが難しくなっています。注: ここでは FileUtils のプロトタイプのメソッドを 1 つだけ示していますが、他にもいくつかのメソッドがあります。
知っている人は、HTML5 と JS のクロスプラットフォーム モバイル開発用に cordova (PhoneGap) ライブラリのメソッドを使用していることにおそらく気付くでしょうが、それはここではあまり関係ありません。