我有一条路线'/getdata'。第一个点击这条路线的用户将从数据库中获取一些数据,这需要 15 秒。到达该路线的第二个用户只会发送一些纯文本。这是代码。
let REQUEST_NUMBER = 0;
let asyncDatabaseFetch = () => {
return new Promise((resolve, reject) => {
// Artifically creating 15 seconds database operation!
setTimeout(() => {
resolve('First request!');
}, 15000);
})
}
app.get('/getdata', (req, res) => {
console.log('Got request on: \'/getdata\'')
REQUEST_NUMBER++;
if(REQUEST_NUMBER == 1) {
asyncDatabaseFetch().then((val) => {
res.send(val);
})
} else {
res.send("No data for you!");
}
});
我的预期是第一个用户必须等待 15 秒才能得到响应,但接下来的用户会立即得到“没有数据给你!” 信息。
但是,发生的情况是,第一个用户必须等待 15 秒才能得到响应,如果第二个用户在第一个用户之后请求路由,他将不得不等待第一个用户的请求被处理。
关于这种行为,我有几个问题:
1)我正在使用 Promises,我认为它是非阻塞的。那么为什么第二个用户仍然要等到第一个用户的请求完成呢?
2)我该如何解决这个问题?如果不是一些数据库查询,我想做一些需要一些时间的繁重计算工作怎么办。有没有办法在处理这个繁重的请求时不让其他请求等待?