我是Node.js的新手,试图学习它并且我对我的问题感到困惑。 问题是如下。我正在尝试使用页面构建一个简单的项目(使用Express),它将显示用户列表,该列表存储在MongoDB中。
这是我的路由器:
var express = require('express');
var router = express.Router();
var userRepository = require('../repositories/user_repository.js');
router.get('/:long?', function(req, res) {
var long = req.param('long');
long = !!long;
userRepository.getAllUsers(function(users) {
res.render('index', {
users: users
});
}, long);
});
module.exports = router;
让我解释一下这个想法。 这是http://mywebsite.com/ url的处理程序,它也可以有一个可选参数(http://mywebsite.com/?long=something)。该参数被转换为布尔类型并传递给userRepository的tge getAllUsersMethod。
这是我的userRepository:
var db = require('../context').db;
var userRepository = {
getAllUsers: function(callback, long) {
var now = Date.now();
var then = now + 5000;
if (long) {
while (Date.now() < then) {}
}
db.users.find({}, function(err, users) {
callback(users);
});
}
};
module.exports = userRepository;
getAllUsers()函数的逻辑取决于'long'参数。如果它是假的,它只需要用户列表形成我的数据库。如果long = true,则sleeps
持续5秒,然后才从数据库中提取数据。
当我输入网址时:http://mywebsite.com/然后是long = false,我会立即看到我的用户列表。
当我输入网址时:http://mywebsite.com/?long=something然后long = true,并且网页按预期加载~5秒。
然后我尝试执行以下操作。我正在输入:http://mywebsite.com/?long=something,然后在另一个标签中输入:http://mywebsite.com/。第一个选项卡按预期加载5秒,但问题是第二个选项卡也等待5秒,直到加载第一个选项卡,然后才加载。这意味着,请求不是异步处理的。有了这个'睡眠',我试图模拟情况,当数据库请求需要花费很多时间来处理。
我做错了什么?
答案 0 :(得分:0)
有了这个&#39;睡眠&#39;我试图模拟情况,当数据库请求将花费大量时间来处理。
我做错了什么?
不要sleep
。这就是你做错了什么。
您的JavaScript在单个线程中运行。如果通过休眠阻塞线程,则Node.js无法继续。如果要模拟需要时间的异步操作,请使用setTimeout
代替回调。