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();
核心修正点说明
- 把one()和two()改成返回Promise的函数,只有当内部的setTimeout回调执行完毕(输出对应内容),才调用
resolved(),这样Promise才会在异步操作完成后进入完成状态。 then(two)传递的是函数引用,Promise完成后会自动调用这个函数;如果写成then(two()),会立刻执行two(),完全失去了异步等待的意义。
内容的提问来源于stack exchange,提问作者Lezir Opav
相关产品推荐
相关产品推荐

