我可以将回调函数作为变量异步传递到多个级别吗?
Can I pass down a callback function as a variable multiple levels asynchronously?
编辑:看来我混淆了异步 I/O 和异步函数。这个对另一个问题的回答对我的学习也有帮助。
我对回调不同步的原因有点困惑。所以我在寻找一些关于我是否需要在 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
被同步调用 - 有序。
区别归结为函数执行的时间(根据执行顺序,而不是时间)。同步语句按照它们在源代码中出现的顺序执行,而异步语句(实际上是函数......)在 done 操作完成时乱序执行。
许多 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();
}
编辑:看来我混淆了异步 I/O 和异步函数。这个对另一个问题的回答对我的学习也有帮助。
我对回调不同步的原因有点困惑。所以我在寻找一些关于我是否需要在 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
被同步调用 - 有序。
区别归结为函数执行的时间(根据执行顺序,而不是时间)。同步语句按照它们在源代码中出现的顺序执行,而异步语句(实际上是函数......)在 done 操作完成时乱序执行。
许多 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();
}