0

我需要返回的值,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);
    }
}
4

4 回答 4

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);
    }
}
于 2013-09-24T23:13:43.700 回答
0

一个好的开始是阅读 Node.js。Node 的目标之一是通过使用回调模式提供非阻塞 I/O 解决方案。因此,Node.js 社区中有大量关于回调模式的资料。

于 2013-09-24T23:06:47.967 回答
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);
于 2013-09-24T23:14:01.023 回答
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);
});
于 2013-09-24T23:49:49.403 回答