【发布时间】:2016-06-22 06:36:47
【问题描述】:
我对 nodejs 有一些困惑,希望得到一些帮助。我有一张名为 camps、contacts 和 camp_contact 的表。我必须根据用户所属的阵营显示联系人列表。我使用 async 循环遍历营地,将其保存在用户会话中,然后从 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'] 并循环遍历它会阻塞线程吗?
最后,有没有办法知道我写的代码是否阻塞了线程?因为每次编写自己的函数时我都会担心。
当使用如下回调创建函数时,我也会感到困惑:
function test(param, fn) { do something; fn(); }
我不确定这种没有定时器的函数是否会阻塞线程。
【问题讨论】:
-
一切都会阻塞线程(除非它在 javascript 之外,例如等待对第 3 方服务/服务器的请求完成),重要的是 多长时间阻塞线程。所以,是的,循环遍历一个数组会阻塞线程,它阻塞线程多长时间以及它是否有害取决于它循环的项目数量以及循环中发生的事情。与 array.concat 相同。
-
有多少项目,取决于用户将输入多少项目。有没有更好的解决方法?我不知道如何将 concat 与我的代码异步使用。
-
除非您遇到性能问题,否则您在这里所做的是premature optimization。
-
你会如何组合两个数组? concat 专门用于此目的,因此使用它是有意义的。您可以使用 for 循环,但根据引擎优化的内容,它的性能可能会降低。它会更工作/更复杂。
-
.concat根本不是资源密集型的。除非您每秒处理成千上万个请求,否则我不会担心(在这种情况下,您可能希望研究实例化多个服务器)
标签: node.js