代码之家  ›  专栏  ›  技术社区  ›  user8555937

NodeJS:while(true)的异步函数停止脚本

  •  0
  • user8555937  · 技术社区  · 4 年前

    我有一个:

    • socketio服务器
    • 值数组
    • 迭代数组并删除它们的异步函数

    这是密码

    // import
    const SocketIo = require('socket.io')
    
    // setup
    const Server = new SocketIo.Server()
    const arrayOfValues = ['some', 'values', 'here']
    
    // server welcome message
    Server.on('connection', async Socket=>{
    
        iterateValues()  // server no longer responds, even if function is async
    
        Socket.emit('welcome', 'hi')
    })
    
    // the async function
    async function iterateValues(){
        while(true){
            if( arrayOfValues[0] ) arrayOfValues.splice(0, 1)
        }
    }
    
    

    每当客户机连接到我的服务器时,必须调用“iterateValues()”,并从数组中异步删除项。 问题 当在任何地方调用“iterateValues()”时,它停止脚本,服务器不再响应。

    我想我误解了异步函数实际上是什么。如何创建一个可以运行无限while循环而不停止其他方法线程的函数?

    1 回复  |  直到 4 年前
        1
  •  2
  •   Giorgi Moniava    4 年前

    我想我误解了异步函数实际上是什么。

    我不是一个后端的家伙,但会给它一个机会。Nodejs仍然在单个线程中运行。所以无限循环会阻塞整个程序。异步并不意味着提供的回调在单独的线程中运行。如果nodejs是多线程的,那么在一个线程中可以有无限循环,例如,这不会阻塞另一个线程。

    异步意味着提供的回调不会立即运行,而是延迟运行,但当它运行时,它仍然在该线程中。