封装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);
修复说明
- 在
setTimeout的回调里,我们先调用了传入的func(也就是sayHello),这样就能在指定时间后打印出'Hello' - 执行完回调后再调用
resolve(),让Promise进入已完成状态,从而触发then方法里的sayGoodbye,紧接着打印出'Goodbye'
运行这段代码后,等待1秒就会依次输出Hello和Goodbye,完全符合你期望的效果~
内容的提问来源于stack exchange,提问作者Hoang Dinh
相关产品推荐
相关产品推荐

