Node.js 是我的代码阻塞节点线程

Node.js 是我的代码阻塞节点线程,node.js,Node.js,我对nodejs有些困惑,希望得到一些帮助。我有一张名为camps,contacts和camp_contact的表格。我必须根据用户所属的营地显示联系人列表。我使用async在camps中循环,保存在用户会话中,然后从mysql中获取数据 var array_myData = []; async.each(req.session.user.camps, function(camps, callback) { database.getConnection(

我对nodejs有些困惑,希望得到一些帮助。我有一张名为camps,contacts和camp_contact的表格。我必须根据用户所属的营地显示联系人列表。我使用async在camps中循环,保存在用户会话中,然后从mysql中获取数据

        var array_myData = [];
    async.each(req.session.user.camps, function(camps, callback) {

        database.getConnection(function(err, connection) {
          // Use the connection

            connection.query('SELECT contacts.*, contact_camp.* '+
            ' FROM contacts JOIN contact_camp '+
            ' ON contact_camp.contact_id = contacts.id '+
            ' WHERE contact_camp.camp_id = ?',
                [camps.camp_id], function(err,data){

                if(err) {
                    //this will call the err function
                  callback('error');

                }
                else {
                    array_myData = array_myData.concat(data);
                    callback();

                }
                connection.release();
          });

        });
        //final function call.
    }, function(err){
        // if any error happened, this function fires.
        if( err ) {
          // All processing will now stop.

        } else {

          res.render('contacts',
                {
                  page
                });
        }
    });
代码运行良好。现在我想知道的是,使用array.concat是否会阻止线程?如果是,我该如何改变?我四处阅读,根据我的理解,非异步的I/O操作会像从文件或数据库读取一样阻塞线程。像这样的数组
var-array=['a','b','c']
并在其中循环是否会阻塞线程

最后,有没有办法知道我写的代码是否阻塞了线程?因为每次我写自己的函数时,我都会担心

当用户创建带有回调的函数时,我也会感到困惑,如:

函数测试(param,fn){do something;fn();}


我不确定这种没有计时器的函数是否会阻塞线程。

好的,如果它能帮助您:

我四处阅读,根据我的理解,非异步的I/O操作会像从文件或数据库读取一样阻塞线程

在NodeJS中,对文件描述符的操作是异步=>非阻塞的

文件描述符将是:

  • 数据库操作
  • 打开/关闭文件
  • 网络运营
例:

我不确定这种没有计时器的函数是否会阻塞线程

通常,您会将该函数放入一个错误处理程序中,如果您没有执行无限期,它不应该阻塞线程

try{}catch(err){
// do something with the error
}

好吧,如果这对你有帮助的话:

我四处阅读,根据我的理解,非异步的I/O操作会像从文件或数据库读取一样阻塞线程

在NodeJS中,对文件描述符的操作是异步=>非阻塞的

文件描述符将是:

  • 数据库操作
  • 打开/关闭文件
  • 网络运营
例:

我不确定这种没有计时器的函数是否会阻塞线程

通常,您会将该函数放入一个错误处理程序中,如果您没有执行无限期,它不应该阻塞线程

try{}catch(err){
// do something with the error
}

所有东西都会阻塞线程(除非它在javascript之外,比如等待对第三方服务/服务器的请求完成),重要的是它阻塞线程的时间有多长。因此,是的,在数组上循环将阻止线程,它阻止线程的时间有多长,以及它是否有害,取决于它循环了多少项以及循环中发生了什么。与array.concat相同。多少项取决于用户将随时间输入多少项。有更好的办法吗?我不知道如何在我的代码中异步使用concat。除非您看到性能问题,否则您在这里所做的就是。否则您将如何组合两个阵列?concat专门用于此目的,因此使用它是有意义的。您可以使用for循环,但它的性能可能会降低,这取决于引擎优化的内容。这将是一项更复杂的工作。
。concat
完全不是资源密集型的。除非您每秒处理10到数千个请求,否则我不会担心(在这种情况下,您可能希望查看多个服务器的实例)所有内容都会阻塞线程(除非它在javascript之外,例如等待对第三方服务/服务器的请求完成),重要的是它阻塞线程的时间。因此,是的,在数组上循环将阻止线程,它阻止线程的时间有多长,以及它是否有害,取决于它循环了多少项以及循环中发生了什么。与array.concat相同。多少项取决于用户将随时间输入多少项。有更好的办法吗?我不知道如何在我的代码中异步使用concat。除非您看到性能问题,否则您在这里所做的就是。否则您将如何组合两个阵列?concat专门用于此目的,因此使用它是有意义的。您可以使用for循环,但它的性能可能会降低,这取决于引擎优化的内容。这将是一项更复杂的工作。
。concat
完全不是资源密集型的。除非您每秒处理10到数千个请求,否则我不会担心(在这种情况下,您可能需要研究实例化多个服务器)
try{}catch(err){
// do something with the error
}