2013-09-24 79 views
0

我需要返回tempVar的值,但我不知道如何做到這一點,因爲它是回調的結果。處理這樣的事情的正確方法是什麼?我不確定如何說出這個問題。我希望能通過做類似var tempReturned = readPWFile('filename.txt');這樣的工作,但即使我在回調的某個地方有「回報」,這也不是很明顯的原因。我的主要目標是將txt文件的結果返回給變量。有人能指引我朝着正確的方向嗎?如何從JavaScript中的回調函數返回變量?

function readPWFile(fileName) { 
    var tempVar; 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) { 
     fileSystem.root.getFile(fileName, null, gotReadFileEntry, fail); 
    }); 

    function gotReadFileEntry(fileEntry) { 
     fileEntry.file(gotFile, fail); 
    } 

    function gotFile(file) { 
     readDataUrl(file); 
    } 

    function readAsText(file) { 
     var reader = new FileReader(); 
     reader.onloadend = function (evt) { 
      tempVar = evt.target.result; 
     }; 
     reader.readAsText(file); 
    } 
} 
+1

回調意味着多個線程。如果這是真的,答案很簡單:你不能。 –

+0

您是否知道從文件中讀取文本並將結果分配給變量的正確方法?感謝您的答覆。 – ajodom10

+0

您不能讀取tempVar,因爲它只存在於readPWFile函數中。 –

回答

2

您應該通過API提供一個回調函數,通過將其作爲回調參數傳遞給變量來授予對變量的訪問權限。

另一種使用的替代方法是通過使用promise,它允許您處理可能還沒有結果的對象。

比如你的函數聲明應該是

function readPWFile(fileName, callback) { 

,並會與

readPWFile(filename, function(tempVar) { 
    alert("Successfully received tempVar"); 
}); 

在本質上調用你的代碼將只回調函數綁定給讀者,而不是用你的代碼。除非你想變異的結果以某種方式當然是:

function readPWFile(fileName, callback) { 
    ... 

    function readAsText(file) { 
     var reader = new FileReader(); 
     // Preference the user's passed in callback function over the previous implementation 
     reader.onloadend = callback; 
     reader.readAsText(file); 
    } 
} 
0

一個好的開始是讀取Node.js。 Node的其中一個目標是通過使用回調模式來提供非阻塞I/O解決方案。所以Node.js社區裏有很多關於回調模式的內容。

+0

謝謝shmuli,我其實已經開始研究Node.js.不過,我需要快速解決這個問題,我還沒有理解Node.js來實現這樣的東西。 – ajodom10

0

你可以嘗試其他的解決辦法

function getContentFile(filePath){ 

    var FileToOpen = function FileToOpen(filePath) 
    { 
     if(window.XMLHttpRequest) var obj = new XMLHttpRequest(); //Firefox, Opera,... 

     else if(window.ActiveXObject) var obj = new ActiveXObject("Microsoft.XMLHTTP"); //Internet Explorer 

     else return(false); 


     if (obj.overrideMimeType) obj.overrideMimeType("text/html"); //Avoids bug with Safari 


     obj.open("GET", filePath, false); 
     obj.send(null); 

     if(obj.readyState == 4) return(obj.responseText); 
     else return(false); 
    } 

    var content = FileToOpen(filePath); 
    return content; 
} 

我使用這個功能,我讀的HTML文件。

,並呼籲像在回調這

var contentFile = getContentFile(yourFilePath/file.html); 
0

通過這個函數被調用當值的更新:

function readPWFile(fileName, cb) { 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) { 
    fileSystem.root.getFile(fileName, null, gotReadFileEntry, fail); 
    }); 
    function gotReadFileEntry(fileEntry) { 
    fileEntry.file(gotFile, fail); 
    } 
    function gotFile(file) { 
    readDataUrl(file); 
    } 
    function readAsText(file) { 
    var reader = new FileReader(); 
    reader.onloadend = function(evt) { 
     cb(evt.target.result); 
    }; 
    reader.readAsText(file); 
    } 
} 

用法:

readPWFile("test", function(val) { 
    console.debug("Value: " + val); 
}); 
相關問題