Node.js中的异步执行

来源:互联网 发布:工资条的制作app软件 编辑:程序博客网 时间:2024/06/08 08:32

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

//print_local_file.jsvar 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);
0 0
原创粉丝点击