Edit:看起来我把异步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)
}
有人能告诉我是否所有这些函数都将异步运行吗?如果不能,有人能给我指明方向,让我了解更多关于异步回调的信息吗?在这一点上,同步/异步函数调用之间的区别对我来说似乎有点神奇。
编辑:
除了额外的函数包装器之外,这两个版本是相同的。
它们都是完全同步的,尽管函数模式由于使用回调而暗示异步执行。
异步代码的一个最小示例是:
setTimeout(function() {
console.log('Asynchronous!');
}, 1000);
console.log('Synchronous...');
setTimeout
回调中的这个console.log
是异步调用的——无序调用,而外部console.log
是同步调用的——有序调用。
差异可以归结为函数何时执行(根据执行顺序,而不是定时)。同步语句按照它们在源代码中出现的顺序执行,而异步语句(函数真的…)在完成操作后按顺序执行。
许多Node对象公开异步操作,这些操作大多与I/O相关,使用"errback"样式的回调函数。一旦异步部分完成(读取文件、连接套接字等),就会调用回调。
这两个代码块是相同的,并且都是同步的。把回调想象成函数调用的链-所有这些都是同步的,除非其中一个函数是异步的-这意味着它在一个单独的进程或线程中运行,或者只是延迟,回调不是立即调用的,而是在特定的时间后调用的。
你把事情搞混了。
回电话是为了告诉:嘿,服务!完成后执行此任务
实际执行的服务可能是一个等待仓鼠完成一英里长迷宫的服务。或者一个简单的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
这是一个同步回调
function hello(err, res){ console.log(hello) }
function start(callback){
console.log('started');
callback();
}