如何使用异步回调响应返回文件内容?

3
我有这段代码。
 function gotFile(file){
    readAsText(file);
}

function readAsText(file) {
    var reader = new FileReader();
    reader.onloadend = function() {  
      var string = evt.target.result;       
    };
      alert(string) // returns null 
    reader.readAsText(file);
}

显然,我正在尝试在同步函数中获取异步回调的结果,这是不可能的。

因此,我已将我的代码更改为:

function gotFile(file){
    readAsText(file,function(str){
        return str;
        });
}

function readAsText(file,callback) {
    var reader = new FileReader();
    reader.onloadend = function() {
     callback(reader.result);
    };
    reader.readAsText(file);
    alert(callback);
}

返回字符串

function(str){
        return str;
}

我该如何实现这个?谢谢。
1个回答

4
在你的更新版本中,你仍然试图将异步操作当作同步操作来使用。
在回调函数中,返回 str 值是没有意义的。你需要在回调函数内部或从回调函数中调用另一个函数中对 str 值进行处理。
例如:
function gotFile(file){
    readAsText(file,function(str){
        alert(str);
    });
}

function readAsText(file,callback) {
    var reader = new FileReader();
    reader.onloadend = function() {
     callback(reader.result);
    };
    reader.readAsText(file);
}

注意区别:我们不是从回调函数callback中返回str,而是在那里对str进行操作(调用alert函数)。

我想将这个字符串值放入一个全局变量中,并在另一个函数中使用它。对它进行警告不会帮助我。 - AshBringer
1
你的其他函数如何知道字符串值已经准备好了呢?它不会知道。你需要从回调函数中调用那个其他函数。 - Michael Geary
真的吗?我迫不及待地想在这个函数中使用它,然后在另一个函数中使用它。 - AshBringer
你在这里所面临的问题是这些函数被调用的时间。把值放到全局变量中以便稍后使用是可以理解的,但事实并非如此。你必须有一种方式让其他函数知道数据已经准备好了,而你需要在准备好的时候调用它。也就是在回调函数内部调用它。 - Michael Geary
很高兴能够帮到你,这个问题在开始使用异步JavaScript代码时几乎会困扰每个人,所以你并不孤单! :-) 如果有任何进一步相关的问题,请随时联系我... - Michael Geary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接