如何用Promise处理JavaScript异步调用:实现延迟打印数字并修正执行顺序
解决方法
你的问题核心是Promise没有在所有setTimeout执行完毕后才resolve,原代码里即便打开resolve(),也会在for循环结束后立即执行(因为for是同步代码),导致end提前打印。下面分两种场景给出解决方案:
场景1:数字按时间点依次打印(总时长10秒)
即数字1在程序启动后1秒打印,数字2在2秒后打印...数字10在10秒后打印,所有数字打印完成后输出end。
修改后的代码:
async function disp(){ console.log("start") await promise(); console.log("end") } function promise(){ return new Promise((resolve) => { const lastNum = 10; // 修正循环条件到10 for(let i=1;i<=lastNum;i++){ setTimeout(() => { console.log(i); // 只有打印最后一个数字时才resolve Promise if(i === lastNum){ resolve(); } }, i*1000); } }) } disp();
场景2:数字顺序串行打印(总时长55秒)
如果你的需求是打完数字1后,再等1秒打数字2,以此类推(即每个数字的延迟是在前一个打印完成后开始计算),可以直接用async/await结合循环,不需要单独写Promise函数:
async function disp(){ console.log("start"); for(let i=1;i<=10;i++){ // 逐个等待每个数字的打印延迟 await new Promise(resolve => { setTimeout(() => { console.log(i); resolve(); }, i*1000); }); } console.log("end"); } disp();
关键说明
- 原代码的循环条件
i<10只会打印到9,需要改为i<=10才能覆盖到数字10。 - 场景1中,我们通过判断当前打印的是否为最后一个数字,来触发
resolve(),确保所有数字都打印完成后才执行console.log("end")。 - 场景2利用
await让循环逐个等待每个Promise完成,实现串行打印的效果。
内容的提问来源于stack exchange,提问作者ekansh
相关产品推荐
相关产品推荐

