2012-07-03 41 views
0
我在与下面的JavaScript代码(PhoneGap的在Eclipse)的问题

全球不承认:Javascript对象成员函数称为回调

function FileStore(onsuccess, onfail){ 
    //chain of Phonegap File API handlers to get certain directories 

    function onGetSupportDirectorySuccess(dir){ 
     //stuff 
     onsuccess(); 
    } 

    function getDirectory(dir){ 
     return "something" + dir; 
    } 
} 

var onFileStoreOpened = function(){ 
    if (window.file_store instanceof FileStore){ 
     console.log('window.file_store is a FileStore'); 
     console.log(window.file_store.getDirectory('something')); 
    } 
} 

var onDeviceReady = function(){ 
    window.file_store = new FileStore(onFileStoreOpened, onFileStoreFailure); 
} 

在这里,我想要做一些事情来初始化文件服务为应用程序,然后在回调中使用它们进行初始化。我收到以下错误消息在logcat中:

07-03 06:26:54.942: D/CordovaLog(223): file:///android_asset/www/index.html: Line 40 : window.file_store is a FileStore 
07-03 06:26:55.053: D/CordovaLog(223): file:///android_asset/www/cordova-1.8.1.js: Line 254 : Error in success callback: File7 = TypeError: Result of expression 'window.file_store.getDirectory' [undefined] is not a function. 

四处移动代码和getDirectory剥离出来后,一切都(),以确保它是有效的,我甚至不知道我理解的错误讯息,这表明对我来说,尽管window.file_store被识别为FileStore对象,但getDirectory()并不被视为window.file_store的成员函数。这对我来说毫无意义,所以我想这种解释是不正确的。任何启示将不胜感激。

因为我已经试过如下:

window.file_store = { 
    app_data_dir : null, 
    Init: function(onsuccess, onfail){ 
     //chain of Phonegap File API handlers to get directories 
     function onGetSupportDirectorySuccess(dir){ 
      window.file_store.app_data_dir = dir; 
      console.log("opened dir " + dir.name); 
      onsuccess(); 
     } 
    }, 

    GetDirectory : function(){ 
     return window.file_store.app_data_dir; //simplified 
    } 
} 


var onFileStoreOpened = function(){ 
    var docs = window.file_store.getDirectory(); 
    console.log('APPDATA: ' + docs.fullPath); 
} 

var onDeviceReady = function() { 
    window.file_store.Init(onFileStoreOpened, onFileStoreFailure); 
} 

,我得到

D/CordovaLog(224): file:///android_asset/www/base/device.js: Line 81 : opened dir AppData 
D/CordovaLog(224): file:///android_asset/www/cordova-1.8.1.js: Line 254 : Error in success callback: File7 = TypeError: Result of expression 'docs' [null] is not an object. 

所有我想在这里做的就是确保存在某些目录(我已经删除所有,但一个)当我开始时,保存目录对象以供将来使用,然后在所有初始化完成后检索并使用它,并且我不希望全局命名空间中的所有内容都被使用。当然,我希望能够在必要时使用特定的实例,并且我感到不安,因为它表明我的理解存在问题,所以我不能这样做,但我甚至不能理解与单一的全球合作。这是Javascript问题还是Phonegap问题?

+0

我真的不确定是否改变了我的编辑方式,并在第二次尝试时改变了底层问题,因为我终于得到了一个不同的错误,但在我看来,底层的问题是关于如何使用JS对象模型进行初始化,初始化完成时执行回调,然后访问已完成的工作。我希望我可以改变标题,使其更清楚。 – chrysanhy

+0

特别是如何做_asynchronous_初始化。 – chrysanhy

+0

var docs = window.file_store.getDirectory();'应该有'GetDirectory',即大写字母G.我会认为编辑问题时是一个错字。 –

回答

1

就目前而言,getDirectory函数是FileStore中的一个私有函数。如果你想使之成为“会员”或的FileStore的“财产”,你需要改变它有点内的FileStore,使它像这样:

this.getDirectory = function(dir){ }; 

或离开它是怎么回事,然后设置一个财产....

this.getDirectory = getDirectory(); 

这样,当新的FileStore被调用时都会有getDirectory作为一个属性,因为调用与“新”

希望这种快速的函数的时候,“这个”关键字总是返回答案有帮助。关于构造函数有很多关于goog的东西。

+0

我尝试了这两种变体,并没有什么区别。我得到完全相同的错误。我确信我也清理了这个项目,只是为了确保。这是我第一个大规模的JS项目,显然我有很多东西要学习如何让我的头部围绕对象模型。不管怎么说,还是要谢谢你! – chrysanhy

+0

这篇文章的确让我想起了围绕公共/私人问题的工作。我忘了所有这些功能都不公开。我只是尝试将该函数移出构造函数,并将其作为FileStore.prototype.getDirectory = function(dir)的前缀,但随后“新的FileStore()”完全失败。 – chrysanhy

1

您了解正确。 getDirectory依然是一个私有函数,不能使用file_store实例调用。

在浏览器中尝试这种方式。

function FileStore(onsuccess, onfail){ 
    function onGetSupportDirectorySuccess(dir){ 
     //stuff 
     onsuccess(); 
    } 

    this.getDirectory = function (dir){ 
    return "something" + dir; 
    } 
} 

window.file_store = new FileStore('', ''); //the empty strings are just placeholders. 
if (window.file_store instanceof FileStore){ 
    console.log('window.file_store is a FileStore'); 
    console.log(window.file_store.getDirectory('something')); 
} 

这将证明基本的js代码工作正常。如果在PhoneGap中使用它时仍有问题,请发表评论。

+0

是的,这是有效的,但如果你将if语句移动到一个新的函数“onSuccess”并传递给构造函数,并且在构造函数调用onGetSupportDirectorySuccess()时,当onSuccess被调用时,window.file_store不再是FileStore的一个实例。这种桌面Chrome浏览器行为实际上对于我来说更为合理(主要来自C++),而file_store是FileStore的一个实例,但不是真的在Android情况下。 – chrysanhy

+1

http://docs.phonegap.com/en/1.9.0/cordova_file_file.md.html#File有每个步骤如何完成异步的例子。下一步作为回调传递给prev步骤。您的日志语句声明app_data_dir具有某些值,但下一个日志语句表示其为null。 ...你可能会发布整个(简化的基本)代码作为要点或东西?没有看到谁在呼叫什么,很难诊断这一点。 –

相关问题