在下一个代码中,我想要同时处理多个文件而不必等到彼此的结尾。因此,我首先读取文件(数组),然后调用回调来处理此数组实例的元素。
我在这个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);
});
}
答案 0 :(得分:1)
您可以将回调放回setTimeout,延迟时间为1毫秒。这将在下一个执行块中运行它,你的循环将继续。
e.g。用这个:
setTimeout(function() { callback(arrayString, table); }, 1);
而不是:
callback(arrayString, table);
另一种方法是使用Web Workers在单独的线程上运行回调。我不认为提供一个描述如何在这里进行多线程JavaScript的长答案是合适的,所以我只是将链接留给文档。 https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers
答案 1 :(得分:0)
此过程作为同步代码而不是异步
执行
我已经看到您刚刚找到问题的答案,请记住JavaScript是单线程。
因此,当您执行需要完全使用CPU的操作时,例如for..loops,while等;你只需要让你的代码同步运行,不仅如此,
如果它们是巨大的循环,您将网页冻结
让我举个例子,这是一个运行6秒的while循环,看看你在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
&#13;
如果你真的想在后台运行阻塞代码,请阅读Web Workers,或者你可以使用我编写的小型库,允许你在后台执行阻塞CPU功能,我称之为< strong> GenericWebWorker