CNode

如何把方法写成异步?

Jjustfly发布于14 年前最后回复13 年前14 回复7777 浏览0 收藏
function get_all_categories(callback){
 function sleep(milliSeconds) {
	 var startTime = new Date().getTime();
 while (new Date().getTime() < startTime + milliSeconds);
}
sleep(10000);
callback();};

这个方法让他sleep10秒,但是一个一面调用他之后,后面访问的页面也要等10秒了,不解,这不是异步的写法么?

查看回复

回复 (14)

J
jiyinyiyong#1·14 年前

是异步, 但是 while 循环把 CPU 卡死了, setTimeout 才可以

J
justfly#2·14 年前
引用 jiyinyiyong是异步, 但是 while 循环把 CPU 卡死了, setTimeout 才可以

setTimeout本身是一个异步函数,我要自己写一个异步函数怎么写?

J
jiyinyiyong#3·14 年前
引用 jiyinyiyong是异步, 但是 while 循环把 CPU 卡死了, setTimeout 才可以

@justfly 难住了... JS 和时间相关就 setInterval 和这个, 不能用的话只好用 http 或者其他进程之类模拟了.. 不懂了.. 求助四楼....

H
huangdh3#4·14 年前

这不是异步这只是一个简单的回调而已!不是回调就是异步的

T
thynson#5·14 年前
function get_all_categories(callback){
  setTimeout(10000, callback);
}

把回调交给setTimeout,然后__立即返回__,定时器到期后自动调用。 这样的做法才是异步,困在一个函数内不返回绝不能称作异步。

J
justfly#6·14 年前

@thynson 好吧,我是想知道setTimeout是怎么实现的

T
thynson#7·14 年前
引用 jiyinyiyong是异步, 但是 while 循环把 CPU 卡死了, setTimeout 才可以

把别人交给你的回调函数转发给setTimeout或者process.nextTick(相当于setTimeout(0)

T
thynson#8·14 年前
引用 justfly@thynson 好吧,我是想知道setTimeout是怎么实现的

这个不太可能用javascript来实现,这个函数实际上是C实现的

J
justfly#9·14 年前
引用 justfly@thynson 好吧,我是想知道setTimeout是怎么实现的

@thynson 哦,果然,豁然明白了!nodejs理论上不适合用js做cpu密集的复杂运算,如果需要就要用其他语言写成多线程的模块了

T
thynson#10·14 年前
引用 justfly@thynson 好吧,我是想知道setTimeout是怎么实现的

@justfly 之所以不能用实现是因为,js部分的代码不能操纵事件循环(每个node.js程序都隐含了一个事件循环,在这里调度了所有的I/O和定时器操作。而且sleep/setTimeout完全不是CPU密集(并不是像你想象中的while(now < date)那样来实现定时器,而是借助于操作系统)。

J
justfly#11·14 年前
S
sonygod#12·13 年前

可以的, 你可以测试下这个冒泡代码

https://gist.github.com/sonygod/5362041
C
cony138#13·13 年前
function asy(callback){
    setTimeout(callback,10000);
}

如果想要异步,在js里面应该只能用cb来做

A
a272121742#14·13 年前

我记得源码中有一段就是能把同步的方法变成异步的

参与回复
登录后即可参与回复。登录