繁体   English   中英

Javascript for循环异步文件执行

[英]Javascript for-loop async File execution

在下一个代码中,我想同时处理多个文件,而不必等待对方结束。 因此,我先读取文件(数组),然后调用回调来处理此数组实例的元素。

我在这个JavaScript代码中发现了一个问题,正是在异步for循环中,该过程以同步代码而不是异步的方式执行。

var array = ['string1','string2','string3','string4'];

function processArray (arrayString,callback){
    //Read file Example.csv thought sync way
    try{
        var ifs = new InputFileStream('Example.csv','utf8');
        table = ifs.read(0);
        ifs.close();
    }catch(err){
        console.log(err.stack);
    }

    callback(arrayString, table);

}

//Async for
for (var i=0; i<array.length; i++) {                
    processArray(array[i], function(arrayString, table){
        //Here process the file values thought async way
        console.log('processed_'+i);
    });
}   

您可以将呼叫放回setTimeout中,延迟为1ms。 它将在下一个执行块中运行,您的循环将继续进行。

例如使用这个:

setTimeout(function() { callback(arrayString, table); }, 1);

代替这个:

callback(arrayString, table);

替代方法是使用Web Workers在单独的线程上运行回调。 我认为在此处提供长答案来描述如何执行多线程JavaScript是不合适的,因此我只保留文档链接。 https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API/Using_web_workers

该过程作为同步代码而不是异步执行

我已经看到您刚刚找到问题的答案,请记住JavaScript是单线程

因此,为此,当您执行需要充分利用CPU的操作时,例如for..loops,while等; 您将使您的代码同步运行,不仅如此,

如果它们是巨大的循环,您将冻结您的网页

让我举一个例子,这是一个while循环,它将运行6秒钟,看看您如何在stackoverflow什么也做不了。

 function blocker (ms) { console.log('You cannot do anything') var now = new Date().getTime(); while(true) { if (new Date().getTime() > now +ms) return; } } blocker(6000) //This stop your entire web page for 6 seconds 

如果您真的想在后台实现有关Web Workers的运行阻塞代码,或者只是可以使用我编写的一个小库,该库允许您在后台执行阻塞CPU功能,我称之为GenericWebWorker

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM