我可以将回调函数作为变量异步传递到多个级别吗?

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();
}