在主线程中执行的异步任务
JavaScript是一种单线程编程语言(可以同时执行一项任务)
因此,它首先运行主线程(同步),然后在事件循环中执行异步任务(这是我的理解,但显然我错了)
Node.js使用libuv一个处理异步任务的库
// synchronously open file descriptor
var fd = fs.openSync('testFile', 'r+');
// synchronously write data to the file
fs.writeSync(fd, ' first data part ');
// asynchronously write data to the file
fs.write(fd, ' second data part ', function(err){
if(err) console.log( err );
});
// asynchronously close the file descriptor
fs.closeSync(fd);
异步写入方法已成功将数据写入文件,但并非总是如此! (方法抛出“错误的文件描述符”错误)
我预计异步'write()'方法会导致错误,因为文件描述符是同步关闭的,因此它不应该具有有效的文件描述符(但并非总是如此)
这里是问题
这是否意味着异步任务由libuv运行单独的JS线程单独执行,因此导致上述示例不会崩溃?
如果我在上面,这在浏览器中是否是相同的行为(浏览器之间是否存在异步差异?
如果我错了,上述异步'write()'方法如何获取文件描述符?
JavaScript是单线程的。 JS的并发样式就是所谓的非阻塞。该代码是在事件循环的一个线程上执行的,因此您无法阻止它或一切都停止(这就是警报阻止您与页面进行交互的原因)。但是,在幕后,浏览器具有用于处理AJAX请求,渲染,事件触发器和文件操作。当他们捕获任何新事件时,会将其推送到事件队列中,然后触发该事件循环,在该循环中您的代码正在运行,并且该循环处理请求。