什么是节点js中“switch case”的执行顺序

时间:2013-07-26 08:18:31

标签: javascript node.js

我是node.js的新手,在运行简单的示例时遇到了一个奇怪的问题。

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

var server = http.createServer(function(request, response){ 
    console.log('Connection');
    var path = url.parse(request.url).pathname;
    console.log(1);
    switch(path){
        case '/':
            response.writeHead(200, {'Content-Type': 'text/html'}); 
            response.write('hello world');
            break;
        case '/socket.html':
            console.log(2);
            fs.readFile(__dirname + path, function(error, data){
                if (error){
                    response.writeHead(404);
                    response.write("opps this doesn't exist - 404");
                    console.log(3);
                }
                else{
                    response.writeHead(200, {"Content-Type": "text/html"});
                    response.write(data, "utf8");
                    console.log(4);
                }
            });
            break;
        default:
            response.writeHead(404);
            response.write("opps this doesn't exist - 404");
            break;
    }
    console.log(5);
    response.end(); 
}); 

server.listen(8001); 

当我访问时

http://localhost:8001/socket.html

后端日志输出如下:

    Connection
    1
    2
    5
    4
    Connection
    1
    5

在浏览器中,没有输出,html的源是空的。注意日志,我想这可能是在日志打印“5”之后,日志打印“4”之前响应已经关闭。

我无法理解为什么日志序列不是“1245”,有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:4)

fs.readFile方法是异步。当您调用它时,会立即继续执行(在break语句处),然后继续执行console.log(5)response.end()调用。

因此,response.end()fs.readFile回调有机会执行之前被称为。您需要在回调中移动response.end()电话