我写了如下三个函数
//A函数 延迟3秒执行
const getA=()=>new Promise(resolve=>{
setTimeout(()=>{
console.log('A');
resolve({msg:'A'});
},3000);
});
//B函数 调用reject方法
const getB=()=>new Promise((resolve,reject)=>{
console.log('B');
reject({msg:'B'});
});
//C函数 使用resolve
const getC=()=>new Promise((resolve,reject)=>{
console.log('C');
resolve({msg:'C'});
});
然后我使用动态传入then参数的方法执行:
let promise=Promise.resolve();
for(let func of [getA,getB,getC]){
promise=promise.then(()=>{
console.log('执行了函数'+func.name);
return func();
});
}
promise.catch(e=>{
console.log(e);
});
最后结果:
这样就有一个问题:为什么在for循环的过程中C函数没有直接被执行?
这样看起来貌似是js预编译了这一段代码,使得B函数reject之后,被catch捕获从而中断了C函数的执行。
但是按照js的逻辑,不是应该从上到下顺序执行吗?
又或者说这与js的宏任务和微任务有关?
原因是then的两个参数fulfilled和rejected,你的代码中B reject了,而后续的then只添加了fulfilled函数没有rejected函数,因此C不会被执行。并且B的rejected会持续传到到最后的catch