Node.js里事件轮换是个怎样的概念?
发布于 9 年前 作者 songqinghehe 3815 次浏览 最后一次编辑是 8 年前 来自 问答

如题,求大神解答

11 回复

一个轮转就是一个tick,简单来说呢,就是结合异步io形成的概念,事件轮询,异步io这是nodejs的本质,参考我在知乎的答案吧:^_^ http://www.zhihu.com/question/24780826 页面上搜索钟凯,那一楼就是我的答案咯

@fantasticsoul 'lu’不是打印出来了么?

@20082496 你何处看到lu被打印出来了呢?? 拷贝下面代码,然后运行,大概过个十几秒,你停掉这个运行,然后到打开C:/log.txt这个文件,看看你找得到lu这个单词不哦亲^_^

var file=“C:/log.txt”; var fs=require(“fs”); fs.open(‘ipz900.avi’, ‘r’, function(err, fd){ fs.appendFileSync(file,“lu\n”); }); while (1) { fs.appendFileSync(file,“Thread A\n”); }

一楼说的等于什么都没说。。。瞎扯。。。 建议楼主看看朴灵的《深入浅出Node》,里面的解释很到位。

@20082496 你好,可以贴一下你的示例代码以及nodejs的版本号吗?我真的很好奇你的这个结果…

@struCoder 我没有瞎扯啊(⊙﹏⊙)b,如果我有什么理解得不对你可以说出来啊,这个问题本来就很开放,你要说得很深那就得扯到libuv(由:libev,libeio(又由kqueue,epoll抽象而来)抽象而来)的轮询机制,这样的话有意思吗???本身很多东西就是一层一层抽茧剥丝理解下去,你觉得要真真正正解释面面俱到,估计这个版面都不够,至少我写了代码,上了干货,方便新人有个事件池的初印象,而不是像你这种人,只会放嘴炮…最讨厌辛苦码帖子还被人家说瞎扯的人啦,大家分享才会有进步,而不是神马去看 什么什么深入深入吧,什么什么primer吧,什么什么编程之美吧,什么什么宝典吧,看了自己闭门造车吗?书上学来终觉浅,绝知此事要躬行,ok??? 关于事件循环和异步,我欣赏这篇:http://www.infoq.com/cn/articles/nodejs-asynchronous-io/ 瞎扯是一回事,理解有误是另一回事,请理解我的反驳

@fantasticsoul 就是1L的代码,我好奇试了下

var fs = require('fs'),
    EventEmitter = require('events').EventEmitter,
    event = new EventEmitter(),
    i = 1;

fs.open('try.js', 'r', function (err, fd) {
    setTimeout(function () {
        console.log('lu');
    }, 100);
});

event.on('test', function () {
    console.log('current number: ' + (i++));
});

setInterval(function () {
    event.emit('test');
},0)

同学你理解错了,我这段代码是反对2楼的:

1楼的代码lu肯定会打印的啊,改造成这样就不打印了,到打开C:/log.txt这个文件看结果: var file=“C:/log.txt”; var start=Date.now(); var fs = require(‘fs’), EventEmitter = require(‘events’).EventEmitter, event = new EventEmitter(), i = 1;

fs.open(‘try.js’, ‘r’, function (err, fd) { setTimeout(function () { fs.appendFileSync(file,(Date.now()-start)+’ lu\n’); }, 100); });

event.on(‘test’, function () { fs.appendFileSync(file,(Date.now()-start)+'current number: ’ + (i++)+"\n"); });

//这一段A,lu在100毫秒后会被打印【注意,代码A,B,C 需要关掉其中2段】 //setInterval(function () { // event.emit(‘test’); //},0);

//这一段B,lu永远不被打印【注意,两段代码A,B,C 需要关掉其中2段】 //while(1){ // event.emit(‘test’); //}

//这一段C,lu永远不被打印,i也不会打印【注意,两段代码A,B,C 需要关掉其中2段】 //while(1){ // console.log(“push callback to even loop”); // process.nextTick(function(){ // event.emit(‘test’); // }); //}

@fantasticsoul 我的意思是:

你既然知道别人接触Node不久,你在这一下子来这么多“高级”概念,这就好像,你刚上小学,问: 某个方程怎么解 然后一个人,告诉你什么微积分。。。。你能接受这样的突如其来? 而朴灵在他的书里也很形象生动并且图文并茂的解释了事件轮询的概念。 初学者总是贴别人的嘴里的什么理论,可当你深入理解后,你就能以自己的话描绘出你理解的事物,这才是深入浅出

再说说你评论的我: 我很少在某一社区中说别人写出来的帖子是瞎扯, 正如你说说的,你最讨厌辛苦码帖子还被人家说瞎扯的人 我只是对事不对人,并且站在我个人的角度上我不喜欢你这样的回帖,如果在stackoverflow上,有你这样的回答,我想会被投票 请求删除的。我个人学艺很浅,我不敢和别人说我不能用我的话描述的道理。
最后:

回答别人的问题,帮组别人解决疑惑永远是对的,但是,用个更好的方式去回答。对问题提出者或者后来的人都是好的典范。 因为在社区里,我就不再对这贴进行回复了 :)

@struCoder 好的,谢谢指正,我的回答方式可能不对,以后会注意改正的

回到顶部