繁体   English   中英

如何使这个JS函数异步?

[英]How do I make this JS function asynchronous?

function takesTime(){

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

takesTime();
console.log('b');

这打印:ab你怎么打印:ba

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

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

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

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

Javascript是基于事件的,一切都发生在一个线程中。 使它“异步”的方法是使用超时(setTimeout())。

您可以使用Web worker来实现您的目标,但是您需要一个单独的js文件,并且您必须添加管道代码来发布消息并处理这些消息。

node.js本身不支持Web worker,但实现可在以下位置获得:

https://github.com/cramforce/node-worker/

否则,它类似于以下代码:

var pid = require('child_process').spawn('node', ['childScript.js'])
pid.stdout.on('data', function(data) {
  console.log(data);
});
console.log('b');

childScript.js

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM