我正在编写一个简单的请求处理程序来返回一对css文件.使用fs.readFileSync这很简单.但是,我无法使用异步版本的readFile来完成同样的任务.以下是我的代码让我的response.write()方法调用在两个不同的回调之间的拆分似乎是有问题的.有人可以指出我做错了什么吗?有趣的是,如果我将response.end()放在第一个else语句里面,这段代码可以工作.但是,这会产生一个问题,因为第二个css文件没有被返回(因为response.end()已经被触发).
function css(response) { response.writeHead(200,{"Content-Type": "text/css"}); fs.readFile('css/bootstrap.css',function(error,content){ if(error){ console.log(error); } else{ response.write(content); } }); fs.readFile('css/bootstrap-responsive.css',content){ if(error){ console.log(error); } else{ response.write(content) } }); response.end(); }
解决方法
您的主要问题是response.end()立即被调用.您只需在文件完成response.write调用后才调用它.
最简单的方法是使用控制流程库.管理多个异步回调通常很复杂.
https://github.com/joyent/node/wiki/modules#wiki-async-flow
我要使用async图书馆,因为它是我最了解的那个.
var fs = require('fs'); var async = require('async'); function css(response) { response.writeHead(200,{"Content-Type": "text/css"}); async.eachSeries( // Pass items to iterate over ['css/bootstrap.css','css/bootstrap-responsive.css'],// Pass iterator function that is called for each item function(filename,cb) { fs.readFile(filename,function(err,content) { if (!err) { response.write(content); } // Calling cb makes it go to the next item. cb(err); }); },// Final callback after each item has been iterated over. function(err) { response.end() } ); }
如果你想完成这个没有一个图书馆,或者只是想要另一种方式,这是我会如何做更直接.基本上,一旦两个文件读取完成,您就会保持计数并调用结束.
function css(response) { response.writeHead(200,{"Content-Type": "text/css"}); var count = 0; var handler = function(error,content){ count++; if (error){ console.log(error); } else{ response.write(content); } if (count == 2) { response.end(); } } fs.readFile('css/bootstrap.css',handler); fs.readFile('css/bootstrap-responsive.css',handler); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。