异步执行的JavaScript的任何解决方案来控制执行? [英] Asynchronous execution in javascript any solution to control execution?

查看:122
本文介绍了异步执行的JavaScript的任何解决方案来控制执行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一个解决方案来控制javascript.I code执行想,除非当前行的code被完全执行,不应在执行下一行code。
有没有什么解决办法吗?

 函数handleFileSelect(EVT){
    var中的文件= evt.target.files;    对于(VAR I = 0; I< files.length;我++){
        警报(对);
        F =文件[I]
        fileExtension = f.name.split('。'),POP()。        如果(fileExtension ='KML'和;!&安培; fileExtension ='KMZ'和;!&安培;!fileExtension ='CSV'){
            警报('不支持的文件类型+ f.type +'('+ fileExtension +')');
            返回;
        }        VAR fileReaderkmlcsv =新的FileReader();
        fileReaderkmlcsv.onloadend = loadend;
        fileReaderkmlcsv.onerror =函数(事件){
            警报(错误:+ event.target.error code);
        };
        fileReaderkmlcsv.readAsText(F);
    } // - 末尾
} // handleFileSelect功能loadend(theFile){
    警报(loadend);
    // code处理我的文件
}


解决方案

的问题是, loadend 是只要任何一个运行的FileReader s已完成加载。你需要重新设计code等待他们的所有3个来完成,是这样的:

 函数handleFileSelect(EVT){
    var中的文件= evt.target.files;
    变种fileReaders = [];
    变种loadCount = 0;    对于(VAR I = 0; I< files.length;我++){
        F =文件[I]
        fileExtension = f.name.split('。'),POP()。        如果(fileExtension ='KML'和;!&安培; fileExtension ='KMZ'和;!&安培;!fileExtension ='CSV'){
            警报('不支持的文件类型+ f.type +'('+ fileExtension +')');
            返回;
        }        功能fileLoaded(){
            loadCount ++;
            //检查是否已经加载的所有文件
            如果(loadCount == files.length){
                loadend(fileReaders);
            }
        }        VAR fileReaderkmlcsv =新的FileReader();
        fileReaderkmlcsv.onloadend = fileLoaded;
        fileReaderkmlcsv.onerror =函数(事件){
            警报(错误:+ event.target.error code);
        };
        fileReaderkmlcsv.readAsText(F);
        fileReaders.push(fileReaderkmlcsv);
    }
  }功能loadend(文件){
    //文件现在包含已完成的FileReader对象的数组
}

请注意,我没有的FileReader对象本身的直接经验 - 如果如果出现错误onloadend不火,你就需要把类似的逻辑在onerror事件以及确保该loadCount变量仍然得到递增/检查等。

I need a solution to control code execution in javascript.I want code on next line should not be executed unless the code on current line is completely executed. Is there any solution?

function handleFileSelect(evt) {
    var files = evt.target.files;

    for (var i = 0; i < files.length; i++) {
        alert("for");
        f = files[i];
        fileExtension = f.name.split('.').pop();    

        if(fileExtension != 'kml' && fileExtension !='kmz' && fileExtension != 'csv'){
            alert('Unsupported file type ' + f.type + '(' + fileExtension + ')');
            return;
        }       

        var fileReaderkmlcsv = new FileReader();                        
        fileReaderkmlcsv.onloadend = loadend;
        fileReaderkmlcsv.onerror = function(event) {
            alert("ERROR: " + event.target.error.code);
        };          
        fileReaderkmlcsv.readAsText(f);             
    } //- end for
} //handleFileSelect

function loadend(theFile) {
    alert("loadend");
    //code for processing my files
}

解决方案

The issue is that loadend is running as soon as any one of the FileReaders has completed loading. You'll need to redesign the code to wait for all 3 of them to finish, something like:

function handleFileSelect(evt) {    
    var files = evt.target.files;    
    var fileReaders = [];
    var loadCount = 0;

    for (var i = 0; i < files.length; i++) {
        f = files[i];
        fileExtension = f.name.split('.').pop();   

        if(fileExtension != 'kml' && fileExtension !='kmz' && fileExtension != 'csv'){
            alert('Unsupported file type ' + f.type + '(' + fileExtension + ')');
            return;
        }

        function fileLoaded() {
            loadCount++;
            //Check if we've loaded all the files
            if (loadCount == files.length) {
                loadend(fileReaders);
            }
        }

        var fileReaderkmlcsv = new FileReader();                        
        fileReaderkmlcsv.onloadend = fileLoaded;
        fileReaderkmlcsv.onerror = function(event) {
            alert("ERROR: " + event.target.error.code);
        };          
        fileReaderkmlcsv.readAsText(f);
        fileReaders.push(fileReaderkmlcsv);
    }
  }

function loadend(files) {
    //files now contains an array of completed FileReader objects
}

Note that I don't have direct experience of the FileReader object itself - if onloadend doesn't fire if an error occurs, you'll need to put similar logic in the onerror event as well to make sure that the loadCount variable still gets incremented/checked etc.

这篇关于异步执行的JavaScript的任何解决方案来控制执行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆