【发布时间】:2018-06-29 23:40:26
【问题描述】:
我正在编写一个简单的(单页)网络应用程序,它依赖于从文件加载天气数据(我有一个单独的脚本来定期刷新数据,因此我不必为每个文件执行大量 HTTP 请求访客)。
我正在使用fs.readFileSync(),因为在将数据作为 Javascript 对象加载之前,所有代码都不起作用。所以我想在这个特定的实例中我需要同步编程。
我是 node.js 和异步编程的新手,我有一个问题:假设,假设 fs.readFileSync 需要 3 秒来加载文件,而其他所有内容都会立即执行。如果访问者 A 访问该站点,则页面加载需要 3 秒。在 t=1 秒,如果我收到一个新的访客 B,访客 B 需要等待 3 秒还是 5 秒?
同步代码会阻止后续代码仅为当前访问者执行,还是会阻止 Express 为任何其他访问者提供服务?
更新:在收到回复告诉我在 Express 网络服务器上同步操作有什么不好的想法后,我已将代码更改为:
var locationList = JSON.parse(fs.readFileSync('locationList.json'));
router.get('/', function(req, res, next) {
res.render('index', {
locationList: locationList
});
});
收件人:
var locationList;
fs.readFile('locationList.json', (err, data) => {
if (err) throw err;
locationList = JSON.parse(data);
});
router.get('/', function(req, res, next) {
res.render('index', {
locationList: locationList
});
});
只是想知道这是否是正确的方法。
【问题讨论】:
-
其实你的第一个sn-p还不错。请注意,它确实会在 打开服务器并为任何客户端提供服务之前的 3 秒内读取文件 - 这对于每个客户端都会立即发生。请注意,它不会为收到的每个请求再次读取文件。当然,这也意味着当文件定期更新时响应不会改变,至少在你重新启动服务器之前不会改变。
-
我什至认为第二个脚本要糟糕得多。它不是在前 3 秒内不为任何请求提供服务,而是为它们提供服务,但使用了错误的数据。
标签: javascript node.js express asynchronous