Javascript for循环异步文件执行

时间:2015-08-18 12:15:12

标签: javascript for-loop asynchronous

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

我在这个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);
    });
}   

2 个答案:

答案 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中怎么做不了。

&#13;
&#13;
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;
&#13;
&#13;

如果你真的想在后台运行阻塞代码,请阅读Web Workers,或者你可以使用我编写的小型库,允许你在后台执行阻塞CPU功能,我称之为< strong> GenericWebWorker