关于代码执行和 javascript 阻塞/非阻塞的性质的问题
Question about code execution and the nature of javascript blocking/ non blocking
基本上我有一些类似于下面的代码,但我不完全确定总是会发生什么执行顺序。现在我想它以非阻塞方式执行,
func() -> self.db.createEntry() -> res.on() -> callback -> self.submit()
但我有几次
func() -> self.db.createEntry() -> callback -> res.on() -> self.submit()
我无法控制 res.on('data')
何时被调用,因为它是套接字事件侦听器并且在单独的服务器上处理。我想我担心回调会在 res.on()
中间被调用,这是可能发生的事情吗?假设 res.on()
正处于执行过程中,回调能够中断它吗?
const func = function(){
self.db.createEntry(self.arg, self.arg1, function(response){
if(response){
self.arg = response
self.state.wait = false
if(self.state.wait){
self.submit()
}
}
});
res.on('data', function(data) {
data = parse(data);
if(!data.contentId){
self.state.wait = true;
self.state.data = data
}
else {
self.submit(data);
}
});
}
func()
db.prototype.createEntry = function(arg, arg1, callback) {
self.connect();
self.connection.query('INSERT INTO table_name SET ?', arg, function(err, results, fields) {
if(err) {
self.disconnect();
callback()
}
else {
self.disconnect();
callback(results)
}
});
}
JavaScript 代码在函数中 中途切换 的唯一方法是 yield
指令。
您当前的功能不包括此类。
yield
也很少使用。相反,我们使用回调(async
/await
代码是类固醇的回调——语法糖使得编写代码变得容易得多,而无需大量用于处理长链回调的内联函数和更简单的方法也可以处理错误)。
self.submit()
会产生这样的回调,但是res.on()
本身不会中途停止。
请记住,JavaScript 仍然是事件驱动的,它不使用多线程。所以一次只执行一个函数。
如果顺序(callback -> res.on()
或 res.on() -> callback
)无关紧要,那么您就可以开始了。
基本上我有一些类似于下面的代码,但我不完全确定总是会发生什么执行顺序。现在我想它以非阻塞方式执行,
func() -> self.db.createEntry() -> res.on() -> callback -> self.submit()
但我有几次
func() -> self.db.createEntry() -> callback -> res.on() -> self.submit()
我无法控制 res.on('data')
何时被调用,因为它是套接字事件侦听器并且在单独的服务器上处理。我想我担心回调会在 res.on()
中间被调用,这是可能发生的事情吗?假设 res.on()
正处于执行过程中,回调能够中断它吗?
const func = function(){
self.db.createEntry(self.arg, self.arg1, function(response){
if(response){
self.arg = response
self.state.wait = false
if(self.state.wait){
self.submit()
}
}
});
res.on('data', function(data) {
data = parse(data);
if(!data.contentId){
self.state.wait = true;
self.state.data = data
}
else {
self.submit(data);
}
});
}
func()
db.prototype.createEntry = function(arg, arg1, callback) {
self.connect();
self.connection.query('INSERT INTO table_name SET ?', arg, function(err, results, fields) {
if(err) {
self.disconnect();
callback()
}
else {
self.disconnect();
callback(results)
}
});
}
JavaScript 代码在函数中 中途切换 的唯一方法是 yield
指令。
您当前的功能不包括此类。
yield
也很少使用。相反,我们使用回调(async
/await
代码是类固醇的回调——语法糖使得编写代码变得容易得多,而无需大量用于处理长链回调的内联函数和更简单的方法也可以处理错误)。
self.submit()
会产生这样的回调,但是res.on()
本身不会中途停止。
请记住,JavaScript 仍然是事件驱动的,它不使用多线程。所以一次只执行一个函数。
如果顺序(callback -> res.on()
或 res.on() -> callback
)无关紧要,那么您就可以开始了。