windows下node入门问题
发布于 3年前 作者 yaolifei 1196 次浏览

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 回调函数的时候还是阻塞的

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

回到顶部