【问题标题】:Javascript for-loop async File executionJavascript for循环异步文件执行
【发布时间】:2015-08-18 12:15:11
【问题描述】:

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

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

【问题讨论】:

  • 是什么让你认为这个结构应该是异步的?
  • 我猜这个例子是实现for循环异步的正确方法。你知道其他方法吗?
  • 我暗示的是这不是异步的。是什么让你认为它是?
  • 你能告诉我这个for循环的异步方式吗?
  • 什么是InputFileStream - 我知道的不是标准的javascript

标签: javascript for-loop asynchronous


【解决方案1】:

您可以在延迟 1 毫秒的 setTimeout 中重新调用。这将在下一个执行块中运行它,并且您的循环将继续。

例如使用这个:

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

【讨论】:

    【解决方案2】:

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

    我看到您刚刚找到了问题的答案,请记住 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

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多