0

我有一条路线'/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)我该如何解决这个问题?如果不是一些数据库查询,我想做一些需要一些时间的繁重计算工作怎么办。有没有办法在处理这个繁重的请求时不让其他请求等待?

4

0 回答 0