【问题标题】:Javascript Custom Callback FunctionJavascript自定义回调函数
【发布时间】:2018-07-11 11:26:15
【问题描述】:

我对 javascript 回调函数有一个担忧。我的理解是,如果需要时间,回调函数应该允许其他语句继续进行。所以我创建了一个自定义回调函数来检查,但我没有得到预期的结果。我在这里做错什么了吗?

function test(param1,param2,cb){
  if(typeof(cb) === 'function') return cb(param1,param2)
  else console.log('im not a func');
}

function calbackFunc(a,b){
    console.log('Hi i am '+a+' '+b);  
}
setTimeout(function timeout(){
        console.log('timeout')
},0);

test('callback','function',calbackFunc);

console.log('console');

输出

“嗨,我是回调函数”

“控制台”

“超时”

根据回调函数,“控制台”应该放在第一位。但它没有发生。像 setTimeout 工作正常。那为什么我的自定义回调函数表现得像 setTimeout。

【问题讨论】:

  • 您在运行回调函数后正在记录console
  • “回调”只是作为参数传递的常规函数​​。所以它和其他函数一样是同步的。
  • 您传递的回调在test() 完成执行之前运行。以 0 的延迟调用 setTimeout 不会立即运行传递的函数,它仍在计划中。它很快就会运行。
  • 那么如何在不使用 SetTimeout 的情况下制作异步回调函数

标签: javascript callback


【解决方案1】:

您对 StackQueue 感到困惑。

事件循环

javascript 中,同步调用进入堆栈,而异步调用进入,完成后返回队列。只有当函数为空时,函数才会从 Queue 移动到 Stack

在你的例子中

第一阶段:致电setTimeout()

这会将函数放入,并且由于超时设置为0,它立即移动到_queue。这是否意味着它正在立即执行?不,因为你当前的函数(“main”)还没有完成。

第二阶段:致电test()

这段代码是同步的!当调用test 时,我们将一个函数添加到堆栈。然后我们将cb() 调用添加到堆栈。 这意味着我们需要完成所有这一切才能进入第 3 阶段。

第三阶段:console.log

这里没什么好解释的

第三阶段后

当前的“主堆栈已完成,因此现在将来自队列的函数添加到堆栈中,记录'timeout'

【讨论】:

  • 谢谢。确实帮助我了解了它的内部运作方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
相关资源
最近更新 更多