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



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

最新更新