Javascript 如何使这个JS函数异步? 函数takesTime(){ for(var i=0;ifor(var i=0;i

Javascript 如何使这个JS函数异步? 函数takesTime(){ for(var i=0;ifor(var i=0;i,javascript,node.js,Javascript,Node.js,还可以查看每个循环增加几毫秒,尽管人们在那里做的工作似乎是基于浏览器的。Javascript是基于事件的,所有事情都发生在单个线程中。使其“异步”的方法是使用超时(setTimeout()).我看到这是标记的node.js,所以我将从这个角度回答:您不应该。通常,如果您正在阻塞,它将是:网络绑定(您应该使用和/或重用异步方法)、I/O绑定(您应该使用和/或重用),或CPU受限。您没有提供任何关于长时间运行任务的上下文,并且假设您有一个包含一些非常大的数字的循环不变量,我假设您正在想象某个CPU密

还可以查看每个循环增加几毫秒,尽管人们在那里做的工作似乎是基于浏览器的。

Javascript是基于事件的,所有事情都发生在单个线程中。使其“异步”的方法是使用超时(setTimeout()).

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


如果你实际上是CPU受限的,你应该重新考虑你的策略。节点只存在于一个核心上,所以即使你能够使用多线程,你也只是在转动你的轮子,因为每个请求仍然需要一定的CPU时间。如果你真的打算做一些计算密集型的事情,你可能想看看你的唱一首歌,然后让其他的东西来处理数据,这样可以更好地处理数据。

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

node.js本机不支持web workers,但可在以下位置获得实现:

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

for (var i = 0; i < someVeryLargeNumber; ++i) {
    setTimeout(function () {
        //do something synchronous
    }, 0);
}
var pid=require('child_process').spawn('node',['childScript.js']) pid.stdout.on('data',函数(data){ 控制台日志(数据); }); console.log('b'); childScript.js for(var i=0;i为什么引号中是“异步”的?异步与多线程不同;这不是“假”异步。不,但异步意味着在继续之前不要等待操作完成。Javascript不会这样做。当其他语言这样做时,会使用并发机制(例如,分离线程/进程/DMA传输/中断例程)例如,C#不使用并发机制(在C#5中,这种异步被烘焙到语言中)。事实上,任何允许回调的语言都可以实现单线程异步。JavaScript可以实现单线程异步。Ajax调用(在web上)或IO操作(在Node.js中)这是一个很好的例子,说明JavaScript在继续之前不会等待操作完成。并发正在使用中,只是不在用户代码中。我没有详细介绍哪一层(用户代码、语言运行时、库和内核)因为它没有太大的相关性。我故意没有说语言实现了它,我说它正在使用中。所以node(非C libs)中的所有异步函数都是这样的是在后台实现的吗?我很难说;我自己还没有看过节点源代码,我也不知道您指的是什么示例函数。其他人可能会回答得更好。在Node.js中,您应该使用process.nextTick(函数),而不是setTimeout(函数,0)--效率更高。请查看更新版本的node。很抱歉,我没有意识到有这样的事情!在问题下面找到更深层次的问题非常好:)一个警告:并非所有浏览器都支持workers;由于OP没有指定特定的浏览器,因此最好假设跨浏览器支持很重要。值得注意的是,IE还不支持workers(但可能在IE9中)。是的,对不起,我应该在它前面加上一个前缀,即这是node.js特定的。
for (var i = 0; i < someVeryLargeNumber; ++i) {
    setTimeout(function () {
        //do something synchronous
    }, 0);
}
var pid = require('child_process').spawn('node', ['childScript.js']) pid.stdout.on('data', function(data) { console.log(data); }); console.log('b'); for (var i = 0; i < some_very_large_number; i++) { // do something synchronous } console.log('a');