我如何使这个JSfunctionasynchronous?

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

这将打印出:a b如何打印:b a

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

如果你实际上是受CPU限制的,你应该重新考虑你的策略。 节点只能在一个内核上运行,所以即使你能够使用multithreading,你也只是在旋转你的车轮,因为每个请求都需要一定的CPU时间。 如果你真的打算做一些计算密集型的工作,你可能需要考虑使用一个排队系统 ,还有一些其他的处理数据的东西,这些数据是为了处理它而devise的。

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

另请参见setZeroTimeout每个循环获得几毫秒的时间,虽然工作人员在那里似乎是基于浏览器的。

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

您可以使用networking工作者来实现您的目标,但是您将需要一个单独的js文件,您将不得不添加pipe道代码来发布消息并处理这些消息。

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

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

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

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

childScript.js

 for(var i = 0; i <some_very_large_number; i ++){
   //做一些同步
 }
的console.log( 'A');