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

Promise resolved提前执行问题:如何实现one()执行完再调用two()

问题分析与解决方法

你的代码有两个关键问题,导致two()在one()完成前就运行了:

  • one()的异步操作没被Promise等待:one()里的setTimeout是异步任务,你在Promise里调用one()后立刻执行了resolved(),根本没等1秒后"ONE"输出,Promise直接进入完成状态。
  • then方法传参错误:promise.then(two())是直接执行了two(),把它的返回值传给then,而不是把two作为回调函数留到Promise完成后再执行。

修正方案

要实现one()执行完成后再执行two(),需要把异步函数封装成Promise,让Promise真正等待异步操作结束,同时正确使用then的回调。

修正后的代码(Promise链式调用)

main();

function main() {
    one()
        .then(two); // 传函数引用,不立刻执行
}

function one() {
    return new Promise(resolved => {
        setTimeout(() => {
            console.log("ONE");
            resolved(); // 异步操作完成后再resolve
        }, 1000);
    });
}

function two() {
    return new Promise(resolved => {
        setTimeout(() => {
            console.log("TWO");
            resolved();
        }, 300);
    });
}

更简洁的async/await写法

如果环境支持ES2017+,用async/await会让顺序执行的逻辑更直观:

async function main() {
    await one();
    await two();
}

function one() {
    return new Promise(resolved => {
        setTimeout(() => {
            console.log("ONE");
            resolved();
        }, 1000);
    });
}

function two() {
    return new Promise(resolved => {
        setTimeout(() => {
            console.log("TWO");
            resolved();
        }, 300);
    });
}

main();

核心修正点说明

  1. 把one()和two()改成返回Promise的函数,只有当内部的setTimeout回调执行完毕(输出对应内容),才调用resolved(),这样Promise才会在异步操作完成后进入完成状态。
  2. then(two)传递的是函数引用,Promise完成后会自动调用这个函数;如果写成then(two()),会立刻执行two(),完全失去了异步等待的意义。

内容的提问来源于stack exchange,提问作者Lezir Opav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:40:02