编辑:看起来我把异步I / O与异步功能混淆了。关于另一个问题的这个答案也帮助我学习。 https://stackoverflow.com/a/6738602/1184321
我对回调不同步的原因感到有点困惑。所以我在寻找一些澄清,我是否需要在Node.js中明确表示回调,以便它们异步运行?
获取示例代码:
start(function (err, resp) {
console.log(resp);
});
function start(callback) {
return isTrue(callback);
}
function isTrue(callback) {
return callback(null, true)
}
上面的示例代码在功能上等同于:
start(function (err, resp) {
console.log(resp);
});
function start(callback) {
isTrue(function(err, resp){
return callback(err, resp);
});
}
function isTrue(callback) {
return callback(null, true)
}
有人可以判断是否所有这些函数都是异步运行的,如果没有,有人会指出我可以学习更多关于异步回调的方向吗?在这一点上,同步/异步函数调用之间的区别对我来说似乎有些神奇。
编辑:
答案 0 :(得分:1)
除了额外的函数包装器,这两个版本是相同的。
它们都是完全同步的,尽管函数模式由于使用了回调而提示异步执行。
异步代码的最小示例是:
setTimeout(function() {
console.log('Asynchronous!');
}, 1000);
console.log('Synchronous...');
console.log
回调中的setTimeout
被异步调用 - 按顺序调用,而不是同步调用的外部console.log
- 按顺序调用。
差异归结为(执行顺序,而不是计时)执行函数的时间。同步语句按照它们在源代码中出现的顺序执行,而异步语句(函数确实......)在完成操作完成时不按顺序执行。
许多Node对象都使用“errback”样式的回调函数来暴露异步操作,主要是与I / O相关的操作。一旦异步部分完成(读取文件,连接套接字等等),就会调用回调函数。
答案 1 :(得分:0)
两个代码块相同,都是同步的。想想回调就像一个函数调用链 - 所有这些都是同步的,除非其中一个函数是异步的 - 这意味着它在一个单独的进程,线程或只是延迟运行,并且回调不是立即召唤,而是在以后的特定时间召唤。
答案 2 :(得分:0)
你正在混淆一点。
回调是为了告诉:嘿,服务!完成后执行此操作。
正在执行的实际服务,它可能是服务等待仓鼠必须完成一英里长的迷宫。或者简单的('ACE', ' OF ', 'DIAMONDS')
('TWO', ' OF ', 'DIAMONDS')
('THREE', ' OF ', 'DIAMONDS')
('FOUR', ' OF ', 'DIAMONDS')
('FIVE', ' OF ', 'DIAMONDS')
('SIX', ' OF ', 'DIAMONDS')
('SEVEN', ' OF ', 'DIAMONDS')
('EIGHT', ' OF ', 'DIAMONDS')
('NINE', ' OF ', 'DIAMONDS')
('TEN', ' OF ', 'DIAMONDS')
('JACK', ' OF ', 'DIAMONDS')
('QUEEN', ' OF ', 'DIAMONDS')
('KING', ' OF ', 'DIAMONDS')
('ACE', ' OF ', 'HEARTS')
('TWO', ' OF ', 'HEARTS')
('THREE', ' OF ', 'HEARTS')
('FOUR', ' OF ', 'HEARTS')
('FIVE', ' OF ', 'HEARTS')
('SIX', ' OF ', 'HEARTS')
('SEVEN', ' OF ', 'HEARTS')
('EIGHT', ' OF ', 'HEARTS')
('NINE', ' OF ', 'HEARTS')
('TEN', ' OF ', 'HEARTS')
('JACK', ' OF ', 'HEARTS')
('QUEEN', ' OF ', 'HEARTS')
('KING', ' OF ', 'HEARTS')
('ACE', ' OF ', 'CLUBS')
('TWO', ' OF ', 'CLUBS')
('THREE', ' OF ', 'CLUBS')
('FOUR', ' OF ', 'CLUBS')
('FIVE', ' OF ', 'CLUBS')
('SIX', ' OF ', 'CLUBS')
('SEVEN', ' OF ', 'CLUBS')
('EIGHT', ' OF ', 'CLUBS')
('NINE', ' OF ', 'CLUBS')
('TEN', ' OF ', 'CLUBS')
('JACK', ' OF ', 'CLUBS')
('QUEEN', ' OF ', 'CLUBS')
('KING', ' OF ', 'CLUBS')
('ACE', ' OF ', 'SPADES')
('TWO', ' OF ', 'SPADES')
('THREE', ' OF ', 'SPADES')
('FOUR', ' OF ', 'SPADES')
('FIVE', ' OF ', 'SPADES')
('SIX', ' OF ', 'SPADES')
('SEVEN', ' OF ', 'SPADES')
('EIGHT', ' OF ', 'SPADES')
('NINE', ' OF ', 'SPADES')
('TEN', ' OF ', 'SPADES')
('JACK', ' OF ', 'SPADES')
('QUEEN', ' OF ', 'SPADES')
('KING', ' OF ', 'SPADES')
[Finished in 0.3s]
语句。
因此定义回调并不意味着您的代码将是异步的。只是意味着您使用的是一种名为事件驱动架构的模式。这些事件可能是同步的或异步的。
例如,这是一个异步回调:
return
这是一个同步回调
function onFinished(err, res){}
function start(callback){
setTimeout(callback, 1000);
}
start(onFinished);
// Can do some sync work here
// But onFinished will be called somewhere asynchronously