2012-11-08 34 views
1

我正在開發一個帶有Cordova 2.1.0的ios應用程序。Cordova/phonegap文件系統沒有準備好「deviceready」

即使「deviceready」事件觸發,fileSystem似乎也不可用。

window.onload = function(){ 
document.addEventListener("deviceready", getSettings(), false); 
} 

function getSettings(){ 
fileSys('settings.txt', 'getContent', null); 
} 

function fileSys(fileName, action, data){ 
    alert('hello'); // fires 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail); 
    alert('hello'); // does not fire 
    //rest of the script breaks 
} 

請求文件系統後腳本中斷。但是,如果我將調用封裝到setTimeout中的fileSys(),它就可以工作。例如:

window.onload = function(){ 
document.addEventListener("deviceready", getSettings(), false); 
} 

function getSettings(){ 
    setTimeout(function(){ 
    fileSys('settings.txt', 'getContent', null); 
}, 500); 
} 

function fileSys(fileName, action, data){ 
    alert('hello'); // fires 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail); 
    alert('hello'); // fires 
    //script runs fine 
} 

對此的任何解決方案?

+0

它也工作正常,如果我將超時設置爲0其實腳本運行完全正常的全部時間用的setTimeout。但我真的很想在發佈應用程序之前瞭解它的底部。任何線索? – Pjottur

回答

4

爲deviceready設置應該是

document.addEventListener("deviceready", getSettings, false); 

「的getSettings()」 是指運行函數現在,並將結果傳遞對addEventListener。

「getSettings」表示向addEventListener傳遞函數引用,以便在事件觸發時運行。

+0

是的,這是做到了。謝謝。 – Pjottur

+0

這從字面上拯救了我的生命 – Matarishvan

2

您的fileSys函數應該以「function」開頭嗎?

function fileSys(fileName, action, data){} 
+0

我不小心讓它不在問題中。不在代碼中。編輯,謝謝。 – Pjottur

0

我也必須在setTimeout(...,0)中放入requestFileSystem函數,但原因是不同的。

我在類構造函數中運行requestFileSystem,並使「成功」函數中的回調調用的代碼工作我應該有構造函數此刻已經完成。

我的構造函數只包含requestFileSystem函數,並以某種方式沒有setTimeTimeout它在「成功」函數後完成。

(僅適用於Android - 我沒有注意到在iOS這樣的expirience)