我对nodejs有一些困惑,希望得到一些帮助。我有一张叫做营地,联系人和camp_contact的桌子。我必须根据用户所属的阵营显示联系人列表。我使用异步循环遍历营地,我在用户会话中保存,然后从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(); }
我不确定这种没有计时器的功能是否会阻塞线程。
答案 0 :(得分:0)
好的,如果它以某种方式帮助你:
我阅读并根据我的理解,非异步的I / O操作阻止线程,如从文件或数据库读取。
在NodeJS中,对文件描述符的操作是异步的=>非阻塞
文件描述符将是:
例如:
fs.readFile('<pathToTheFile>', (err, data) => {
if (err) throw err;
console.log(data);
});
// if your file is very big, until it is read, maybe other requests will be finished
像这样的数组var array = ['a','b','c']并循环遍历它会阻塞线程吗?
是的,它会阻塞线程,但这样的操作不是资源密集型的。 NodeJs是一种事件驱动的语言(单线程),但是,在多线程或多进程语言中,内核线程仍然会被这样的操作阻止=&gt;同样的事情......这可能是偏离主题的。
// if you do something like this
while(true){
function test(param, fn) { do something; fn(); }
}
// you will see that you just blocked the thread
我不确定这种没有计时器的功能是否会阻塞线程
通常你会把这个函数放在一个错误处理程序中,如果你没有做无限的话,它不应该阻塞该线程。
try{}catch(err){
// do something with the error
}