如何使这个JS函数异步?

mkr*_*cny 20 javascript node.js

function takesTime(){

    for (var i = 0; i<some_very_large_number; i++){
        //do something synchronous
    }
    console.log('a');
}

takesTime();
console.log('b');
Run Code Online (Sandbox Code Playgroud)

这打印:a b你怎么打印:b a

Dom*_*nic 20

for (var i = 0; i < someVeryLargeNumber; ++i) {
    setTimeout(function () {
        //do something synchronous
    }, 0);
}
Run Code Online (Sandbox Code Playgroud)

另外,请参阅setZeroTimeout以获得每个循环几毫秒,尽管人们在那里做的工作似乎是基于浏览器的.

  • 在node.js中,你应该使用process.nextTick(function),而不是setTimeout(function,0) - 它更有效. (6认同)

Mar*_*ger 16

我看到这是标记为node.js,所以我将从这个角度回答:你不应该.通常,如果你阻塞,它将是:网络绑定(你应该使用和/或重用异步方法的网络库),I/O绑定(你应该使用和/或重用I/O库)或受CPU限制.你没有为长期运行的任务提供任何上下文,并且假设你有一个包含循环不变量some_very_large_number,我假设你正在想象一些CPU密集型任务在一个大字段上迭代.

如果您实际上是CPU限制的,那么您应该重新考虑您的策略.节点只存在于一个核心上,所以即使你能够使用多线程,你也只是在转动轮子,因为每个请求仍然需要一定的CPU时间.如果你真的打算做一些计算密集型的事情,你可能需要考虑使用排队系统,还有其他处理数据的东西,这些数据更适合用于处理它.

  • 非常好的工作找到问题下更深层次的问题:) (6认同)