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

时间:2015-12-23 16:37:37

标签: javascript node.js asynchronous callback synchronous

编辑:看起来我把异步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)
}

有人可以判断是否所有这些函数都是异步运行的,如果没有,有人会指出我可以学习更多关于异步回调的方向​​吗?在这一点上,同步/异步函数调用之间的区别对我来说似乎有些神奇。

编辑:

3 个答案:

答案 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