2012-08-06 8 views
1

J'essaie de définir une valeur de variable au niveau d'un objet (classe) à partir de quelques niveaux d'appels de méthode javascript anonyme imbriqués. Comment puis-je faire cela?Fermetures de méthodes anonymes imbriquées en javascript

Voici un code pour expliquer ce que j'essaie de faire. Disclaimer: Je ne suis pas si à l'aise avec le concept des fermetures en javascript, donc je vais peut-être suivre un mauvais chemin ici. Toute suggestion concernant un moyen succinct de réaliser ce que je veux faire serait grandement appréciée.

// 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); } 
     ); 
    } 
} 

Je sais que la portée (en utilisant « ceci ») est tout faux dans la pièce au-dessus du code, mais ne savez pas comment faire les choses. J'ai vu quelques réponses sur la liaison au contexte (comme this one), mais j'utilise des méthodes anonymes, ce qui rend plus difficile. Note: Bien que je ne montre qu'une seule méthode dans le prototype de FileUtils ici, il y en a quelques autres. Ceux qui sont conscients peuvent probablement reconnaître que j'utilise des méthodes de la bibliothèque cordova (PhoneGap) pour le développement mobile multiplateforme en HTML5 et JS, mais ce n'est pas vraiment pertinent ici.

+1

Vous pouvez utiliser 'thisObj' au lieu de' this' dans les fonctions imbriquées – Esailija

+0

@Esailija: Merci .. essayait cela mais ne l'implémente pas complètement. –

Répondre

1
… function() { function() { function() { … 
        // Set values for future use 
        // [** Definitely wrong scoping. The class level variable 
        // can't be accessed using 'this'. What to do? **] 
        this.ConfRootDir = confDir; 

Vous avez déjà préparé la réponse: thisObj.ConfRootDir. La variable thisObj est disponible dans la portée de la fonction imbriquée et pointe toujours sur this keyword de la fonction externe getFileEntry, c'est-à-dire vers l'instance FileUtils.

+0

Gee .. merci. J'ai mis dans cette ligne (var thisObj = this;) pensant que je vais tester, mais a tiré la question avant de le faire réellement. On se sent bien que j'étais assez proche :-) –

Questions connexes