Javascript 如何等待异步函数结果?
下面是我从指定路径读取文件的一段代码Javascript 如何等待异步函数结果?,javascript,Javascript,下面是我从指定路径读取文件的一段代码 for (var i in e.target.files) { var reader = new FileReader(); reader.onload = function (e) { alert("File loaded successfully"); var output = e.target.result; // console.log("output: "+ou
for (var i in e.target.files) {
var reader = new FileReader();
reader.onload = function (e) {
alert("File loaded successfully");
var output = e.target.result;
// console.log("output: "+output);
}
reader.log是一个异步函数,我想要的是等待reader.load事件触发,然后移动到下一个迭代
我还通过无限for循环强制阻止了这一点,但我的浏览器在这一点上崩溃了。我也尝试过settimeout和setinterval方法,但都是徒劳的。我只想停止,直到reader.load事件触发,然后移动到下一个迭代。JavaScript是异步构建的。若低级开发人员决定某个函数需要异步,那个么您就无能为力,实际上您也不应该这样做。可能需要一些时间,用户会看到他的浏览器(或其他运行时环境)被挂起。您应该重新构造代码,这样就不用等待,而是为每个异步事件触发回调,这将增加一个计数器,然后再次执行该函数。比如:
var files = [],
fileCount = 0,
currentFile = 0;
for (var i in e.target.files) {
if (e.target.files.hasOwnProperty(i)) {
fileCount++;
}
}
function allLoaded() {
// process data.
}
function loadHandler(loadEvent) {
files.push(loadEvent.target);
loadNext();
}
(function loadNext() {
if (currentFile < fileCount) {
currentFile++;
var reader = new FileReader();
reader.onload = loadHandler;
} else {
allLoaded();
}
})();
var文件=[],
fileCount=0,
currentFile=0;
for(e.target.files中的变量i){
if(例如target.files.hasOwnProperty(i)){
fileCount++;
}
}
函数allLoaded(){
//处理数据。
}
函数loadHandler(loadEvent){
文件推送(loadEvent.target);
loadNext();
}
(函数loadNext(){
如果(当前文件<文件计数){
currentFile++;
var reader=new FileReader();
reader.onload=loadHandler;
}否则{
全部加载();
}
})();
假设您的代码段缺少类似于reader.log(i)
的调用,解决方案如下:
var currentItemIndex = 0;
if (e.target.files.length > currentItemIndex) {
readNext(e.target.files[currentItemIndex]);
}
else {
endOfWait();
}
function readNext(item) {
currentItemIndex ++;
var reader = new FileReader();
reader.onload = function (x) {
alert("File loaded successfully");
var output = x.target.result;
if (e.target.files.length > currentItemIndex) {
readNext(e.target.files[currentItemIndex]);
}
else {
endOfWait();
}
}
reader.log(item);
}
function endOfWait() {
// put code here that executes once the wait is over
}
你永远都不想在JS中“等待”。即使你想,也要从脑海中抹去这个想法(即,这是不可能的)。很可能你想在加载文件后将逻辑放入回调函数的某个地方。请参阅。这也适用于你的情况。好吧,你可以用延续来完成你想做的事情。这在javascript中并不容易,但是。。。一开始可能有点令人难以置信,但它允许您在异步环境中正常工作。异步调用它有什么问题?这就是JavaScript的工作方式,您甚至不应该考虑更改它。如果您想通知用户进度,您可以这样做,但不要尝试挂起浏览器,因为他们通常不允许挂起浏览器,然后关闭选项卡,再也不回来。您遇到了什么问题?请您也通过调用
reader.log
来更新您的问题?先生,它的递归函数仍然异步工作。您认为它错了-我刚刚更新了我的答案-将代码添加到endOfWait
方法中,以便在“等待”之后执行您想要执行的代码。