Node.js中的异步执行

刚看了一点马丁的《代码整洁之道》,于是心血来潮想把这几天做的Node联系进行一番代码重构,心里默念,高内聚低耦合,函数简洁明了,etc…
于是,在这段要读取本地文件内容的代码中,我将createServer后的回调printFile以及readFile后的回调getData都准备抽出来,并打算通过赋值的方式获取fileData,并最终将fileData打印到页面,代码如下:

//print_local_file.js

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

var fileData = "";

function getData(err, data) {
    if (err) {
        throw err;
    }
    // 操作data
    fileData = data;
    console.log(fileData);
}

function printFile(req, res) {
    console.log("server started");
    fs.readFile("text.txt", getData);
    res.writeHead(200, {
        "Content-Type": "text/plain"
    });
    res.write(fileData);
    res.end()
}
http.createServer(printFile).listen(8888);

结果,getData中的console.log(fileData)还没执行完就直接报错:

这里写图片描述

这让人反思:
getData还没有执行就去执行了res.write
getData是回调函数!!!

看来不能这样写,目前是没有办法把函数抽出来了,只能乖乖的用异步了:

function printFile(req, res) {
    console.log("server started");
    fs.readFile("text.txt", function(err,data){
        res.writeHead(200, {
            "Content-Type": "text/plain"
        });
        res.write(fileData.toString());
        res.end()
    });
}

据说,Node.js提供了一种机制可以进行异步控制,叫做promise,稍后会去学!

ps:fs.readFileSync是fs.readFile的同步版本,读取到的文件内容会以函数返回值的形式返回。
所以,可以这样写:

function printFile(req, res) {
    console.log("server started");

    var fileData = fs.readFileSync("text.txt", "utf-8");
    res.writeHead(200, {
        "Content-Type": "text/plain"
    });
    res.write(fileData);
    res.end()
}
http.createServer(printFile).listen(8888);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值