Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何避免node express被fetch调用阻塞_Javascript_Node.js_Express_Asynchronous_Fetch - Fatal编程技术网

Javascript 如何避免node express被fetch调用阻塞

Javascript 如何避免node express被fetch调用阻塞,javascript,node.js,express,asynchronous,fetch,Javascript,Node.js,Express,Asynchronous,Fetch,我使用setInterval模拟了node express路由上耗时的异步操作。当setInterval正在等待时,node express没有响应其他客户端的请求。 可以采取什么措施来防止线路阻塞 这是我使用的模拟: 我打开了两个客户端,试图同时发送来自这两个客户端的请求。测试是在本地主机上完成的 我已经一次又一次地测试了它,第二个客户机只有在第一个客户机请求的所有十个请求都得到响应之后才从服务器获得响应 客户端: <button onclick='getManyData()'>G

我使用
setInterval
模拟了node express路由上耗时的异步操作。当
setInterval
正在等待时,node express没有响应其他客户端的请求。 可以采取什么措施来防止线路阻塞

这是我使用的模拟:

我打开了两个客户端,试图同时发送来自这两个客户端的请求。测试是在本地主机上完成的


我已经一次又一次地测试了它,第二个客户机只有在第一个客户机请求的所有十个请求都得到响应之后才从服务器获得响应

客户端:

<button onclick='getManyData()'>Get Data </button>
   
    <script>
        function getManyData(){

            for(let i=0; i<10;i++){
                getData()
            }
        }

        function getData(){
           
            fetch('/api/req1')
            .then(res=>res.json())
            .then(data=>{
               
                console.log(data)
            })

        }
    </script>
const express = require('express');
const app = express();


app.use(express.static('public'))

app.get('/api/req1', (req, res) => {
    setTimeout(()=>{
        res.send({ ok: true })
    },500)
    
})

app.listen(3000, () => { console.log('listen on port 3000') })
这是它在网络上的外观:

更新:

<button onclick='getManyData()'>Get Data </button>
   
    <script>
        function getManyData(){

            for(let i=0; i<10;i++){
                getData()
            }
        }

        function getData(){
           
            fetch('/api/req1')
            .then(res=>res.json())
            .then(data=>{
               
                console.log(data)
            })

        }
    </script>
const express = require('express');
const app = express();


app.use(express.static('public'))

app.get('/api/req1', (req, res) => {
    setTimeout(()=>{
        res.send({ ok: true })
    },500)
    
})

app.listen(3000, () => { console.log('listen on port 3000') })

我发现这种现象只发生在chrome上,而不是firefox上(在firefox中,所有请求都会在大约500毫秒后得到响应)。关于为什么会发生这种情况,有什么建议吗?

我怀疑您可能没有您认为存在的问题。您的express代码似乎没有任何问题。我已经反复测试了它,第二个客户端只有在响应了第一个客户端请求的所有十个之后才从服务器获得响应。由于NodeJ的单线程特性,如果您的端点正在执行阻塞/同步操作,则您会看到这种行为。你发布的代码没有做到这一点,但是你真的发布了你的真实代码吗?是的,只是复制粘贴的代码。我认为这可能是一个理解的例子,而不是一个实际问题。听起来你希望电话开始得晚一些,有时结束得早一些?这不是异步代码的属性。在实践中,即使异步执行,事情也会按顺序排队执行。如果所有的请求都花费相同的时间来执行其逻辑请求,那么它们大部分都会按顺序返回。此行为将由VM中的blackbox代码管理,该代码计划异步代码的执行。请记住,NodeJS中没有并行执行代码。它只有一根线。