我如何使这个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');