我需要返回tempVar
的值,但我无法弄清楚如何执行此操作,因为它是回调的结果。处理这样的事情的正确方法是什么?我不确定如何说出这个问题。我希望通过做var tempReturned = readPWFile('filename.txt');
这样的事情来起作用,但这并不是出于显而易见的原因,即使我在回调的某个地方有'返回'。我的主要目标是将txt
文件的结果返回给变量。有人能指出我正确的方向吗?
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);
}
}
答案 0 :(得分:2)
您应该通过API提供回调,该回调将通过将其作为回调参数传递来授予对该变量的访问权。
使用的另一种方法是使用promises,它允许你处理一个可能还没有结果的对象。
例如,你的函数声明应该是
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);
}
}
答案 1 :(得分:0)
一个好的开始是阅读Node.js. Node的目标之一是通过使用回调模式提供非阻塞I / O解决方案。因此,Node.js社区中的回调模式有很多材料。
答案 2 :(得分: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);
答案 3 :(得分: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);
});