2012-07-03 78 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。 ...你可能會發布整個(簡化的基本)代碼作爲要點或東西?沒有看到誰在呼叫什麼,很難診斷這一點。 –

相關問題