【问题标题】:Synchronous and Asynchronous callback functions in ES6 and Node [duplicate]ES6和Node中的同步和异步回调函数[重复]
【发布时间】:2018-04-09 16:00:37
【问题描述】:

我是 ES6 和 Node.js 的新手

我想了解回调函数在同步环境和异步环境中是如何工作的。

我尝试在 Node 中运行以下命令:

function func1() { 
    console.log('hello'); 
}

func1(function(){ 
    console.log('world');
}); 

根据我对异步回调的理解,func1 应该首先执行,当 func1 完成执行时,它会回调其参数列表中的函数。

所以在这种情况下:

console.log('world') 

应该在第二位执行,但我只是作为输出得到:hello

我错过了什么吗?有人可以用清晰的例子向我解释回调是如何工作的吗?在同步环境中是否相同?

【问题讨论】:

  • function func1(callback) { console.log('hello'); callback(); }
  • 回调的发生并不意味着异步代码。您的示例不是异步的。

标签: node.js asynchronous callback ecmascript-6 synchronous


【解决方案1】:

您应该首先检查您的 func1() 函数:

function func1() { 
    console.log('hello'); 
}

要认识到的最重要的事情是它需要零参数。结果是你传递给它的东西并不重要。例如:

func1("world")
func1(1)
func1(false)
func1(function (){console.log('world)}

所有操作都完全相同,因为func1() 会忽略作为参数传入的所有内容。

如果您想传递回调,则需要不忽略其参数的函数,因为它们需要使用该回调做某事。所以一个接受回调的函数应该有一个更像这样的签名:

function func1(some_argument){
   // do something with argument
}

如果您希望该参数是一个函数,那么自然的做法是执行它:

function func1(some_function){
    // call that function
    some_function()
}

因此,对于您的示例,您最终会得到:

function func1(callback) { 
    console.log('hello');
    callback() 
}

func1(function(){ 
    console.log('world');
}); 

这将导致两个console.log()s。

另外,因为它在标题中,所以这里没有任何异步发生。

【讨论】:

    【解决方案2】:

    因此,当您运行func1(function(){...}) 时,您实际上是在将未命名或“匿名”函数作为参数传递给func1。但是,要用作 回调,您需要显式执行它。

    function func1(fn) { 
        console.log('hello'); 
        fn();
    }
    
    func1(function(){ 
        console.log('world');
    }); 
    

    在其他节点库中,开发人员最有可能处理您为其函数提供的回调,这就是它们工作的原因。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多