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

封装setTimeout返回Promise的延时函数异常:仅执行then回调未触发传入回调

问题分析与修复方案

我来帮你梳理下问题出在哪~你的doAfter函数目前只是在指定时间后resolve了一个Promise,但完全没有调用传入的回调函数func!这就导致sayHello根本没机会执行,只有Promise resolve后then链里的sayGoodbye被触发,所以你只能看到'Goodbye'的输出。

修复后的代码

function doAfter(func, time) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      // 先执行传入的回调函数
      func();
      // 回调执行完成后resolve Promise,触发后续then逻辑
      resolve();
    }, time);
  });
}

function sayHello() {
  console.log('Hello');
}

function sayGoodbye() {
  console.log('Goodbye');
}

doAfter(sayHello, 1000).then(sayGoodbye);

修复说明

  1. 在setTimeout的回调里,我们先调用了传入的func(也就是sayHello),这样就能在指定时间后打印出'Hello'
  2. 执行完回调后再调用resolve(),让Promise进入已完成状态,从而触发then方法里的sayGoodbye,紧接着打印出'Goodbye'

运行这段代码后,等待1秒就会依次输出Hello和Goodbye,完全符合你期望的效果~

内容的提问来源于stack exchange,提问作者Hoang Dinh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:28:58