[英]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.