You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用回调(callback)控制异步代码的执行顺序?

如何用回调修正异步代码的执行顺序

嘿,你的思路其实已经对了一半!问题出在你调用first函数的时候没有传递回调参数,导致cb是undefined,执行cb()自然会报错。咱们来一步步修正:

你的代码问题分析

你写的first函数已经预留了回调参数cb,但调用时只写了first(); second();,没有把second作为回调传进去,所以当setTimeout里执行cb()时,找不到这个函数,就会抛出错误。

正确的回调实现

只需要在调用first的时候,把second作为参数传进去就可以了,完整代码如下:

function first(cb){ 
  // 模拟代码延迟
  setTimeout( function(){ 
    console.log(1); 
    cb(); // 延迟结束后执行回调
  }, 500 ); 
}
function second(){ console.log(2); }

// 把second作为回调传给first
first(second);

执行这段代码,就会先输出1,等待500ms后执行cb()也就是second(),输出2,完美符合你的预期!

额外扩展:用匿名回调的写法

如果你不想单独定义second函数,也可以直接传一个匿名函数作为回调,效果是一样的:

function first(cb){ 
  setTimeout( function(){ 
    console.log(1); 
    cb(); 
  }, 500 ); 
}

first(function() {
  console.log(2);
});

执行逻辑再梳理一下

  1. 调用first(second)时,cb参数指向了second函数;
  2. first内部启动setTimeout,这个异步任务会被放到事件队列中,主线程继续执行后续代码(这里没有其他代码,所以主线程空闲);
  3. 500ms后,setTimeout的回调执行,先打印1,然后调用cb()也就是second(),打印2。

这样就完全实现了你想要的先1后2的输出顺序啦!

内容的提问来源于stack exchange,提问作者The Walrus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:05