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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:05:33