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
方法中,以便在“等待”之后执行您想要执行的代码。