windows下node入门问题
发布于 12 年前 作者 yaolifei 4149 次浏览 最后一次编辑是 8 年前

http://www.nodebeginner.org/index-zh-cn.html#javascript-and-nodejs 看的是这个入门的 但是始终实现不了异步,一直是阻塞的upload执行的时候也要等上10秒,我是在windows7下,用官方的安装包,求指点,代码如下:

index.js

var server = require('./server');
var router = require('./router');
var requestHandlers = require('./requestHandlers');
        
var handle = {};
handle['/'] = requestHandlers.start;
handle['/start'] = requestHandlers.start;
handle['/upload'] = requestHandlers.upload;
server.start(router.route, handle);

server.js

var http = require('http');
var url = require('url');

function start(route, handle) {
	http.createServer(function(request, response){
		var pathname = url.parse(request.url).pathname;
		console.log('Request for ' + pathname + ' received!')
		
		route(handle, pathname, response);
	}).listen(8080);
	
	console.log('Server has started!')
}

exports.start = start;

router.js

function route(handle, pathname, response) {
	console.log('About to route a request for ' + pathname);
	if (typeof handle[pathname] === 'function') {
		handle[pathname](response);
	} else {
		console.log('No request handler found for ' + pathname);
		response.writeHead(404, {'Content-Type': 'text/plain'});	
		response.write('404 Not found!');
		response.end();
	}
}

exports.route = route;

requestHandlers.js

var exec = require('child_process').exec;

function start(response) {
	console.log("Request handler 'start' was called.");
	
	exec('dir', function(error, stdout, stderr){
		function sleep(milliSeconds){
			var startTime = new Date().getTime();
			while (new Date().getTime() < startTime + milliSeconds);
		}
		sleep(10000);
		response.writeHead(200, {'Content-Type': 'text/plain'});	
		response.write(stdout);
		response.end();
	});
}

function upload(response) {
	console.log("Request handler 'upload' was called.");
	response.writeHead(200, {'Content-Type': 'text/plain'});	
	response.write('Hello upload!');
	response.end();
}

exports.start = start;
exports.upload = upload;

照理说start方法中exec是异步的,那为什么浏览器调用start后,再调用upload,upload没有立即返回呢?

4 回复

没有人看这个入门的吗? 真郁闷

我看入门时候 Linux 下很乖抄代码的所以没发现…
对比楼主的代码是把两个例子混到一起了, 是不是因为 Windows 所以故意改了?
exec 没有问题, 但 Linux 下 find / 直接就能浪费时间的, 就没有同样位置的 sleep(),
sleep() 在教程中有提到 start() 这段包含阻塞, 所以阻塞了,
我理解是 exec 正常运行的, 因为速度快, 马上进入 sleep() 的阻塞了.
不知道 Windows 有什么能比上 find / 的命令…

start exec 回调函数的时候还是阻塞的

我以前看过,也遇到这个问题,到现在我也没想明白。

回到顶部