Promise控制流疑问:为何代码执行顺序与预期不符?
你的理解误区:Promise构造函数的回调是同步执行的
先看你给出的这段代码:
function provideError(){ for(var i=0; i< 100 ; i++){ console.log("first Loop"); } return new Error("error"); } function promise1(){ return new Promise(function(resolve,reject){ // reject(new Error("alas")) reject(provideError()) }) } promise1().then((result)=>{ console.log("Resolved error free") }).catch((error)=>{ console.error("An error occurred"); }) for(var i = 199 ; i> 100 ; i--){ console.log(i) }
你误以为promise1内部的循环是异步启动的,但实际上Promise构造函数的第一个参数(executor函数)是同步执行的,这就是核心误解点。我们一步步拆解代码的执行顺序:
- 调用
promise1()时,会立即创建Promise实例,同时同步执行executor函数(就是你写的function(resolve,reject){...})。 - 在executor里,同步调用了
provideError(),所以这个函数里的for循环会同步跑完100次,打印100条"first Loop",然后返回Error对象,接着执行reject()把Promise置为rejected状态。 - 此时
.catch()的回调函数并不会立即执行——它会被加入到微任务队列,等待所有同步任务执行完毕后才会处理。 - 接下来执行后面的同步代码:那个倒序for循环(从199到101)会同步执行,完整打印所有数字。
- 当所有同步任务都执行完成后,事件循环才会去处理微任务队列,这时才会执行
.catch()里的console.error("An error occurred");。
所以实际的输出顺序就是你给出的正确控制台输出:先打完100次"first Loop",再打印199到101的数字,最后打印错误信息,完全不会出现日志混合的情况。
内容的提问来源于stack exchange,提问作者amitKumar
相关产品推荐
相关产品推荐

