关于promise动态传入then参数的问题

发布于 2022-09-12 01:02:47 字数 944 浏览 20 评论 0

我写了如下三个函数

//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);
});

最后结果:
image.png

这样就有一个问题:为什么在for循环的过程中C函数没有直接被执行?
这样看起来貌似是js预编译了这一段代码,使得B函数reject之后,被catch捕获从而中断了C函数的执行。
但是按照js的逻辑,不是应该从上到下顺序执行吗?
又或者说这与js的宏任务和微任务有关?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

給妳壹絲溫柔 2022-09-19 01:02:48

原因是then的两个参数fulfilled和rejected,你的代码中B reject了,而后续的then只添加了fulfilled函数没有rejected函数,因此C不会被执行。并且B的rejected会持续传到到最后的catch

醉生梦死 2022-09-19 01:02:48

只有 Promise 变成 fullfilled 才会执行 then 的第一个回调。

rejected Promise 不会执行 then 的第一个回调。

Promise.prototype.then 可以接受两个参数,都是回调,第一个 fullfilled 之后执行,第二个 rejected 之后执行。两个只会执行一个。

泛滥成性 2022-09-19 01:02:48

Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)

因为你没有写catch捕获reject

所以你这么写就有输出了

for(let func of [getA,getB,getC]){
 promise=promise.then(()=>{
     console.log('执行了函数'+func.name);
     return func();
 }).catch(e=>{
   console.log(e);
 });;
}

out:

执行了函数getA
A
执行了函数getB
B
{ msg: 'B' }
执行了函数getC
C
清眉祭 2022-09-19 01:02:48

这跟 Promise 关系不大,你只是单纯不理解函数什么时候会被执行而已。

建议:好好理解一下 函数声明函数执行 之间的关系,再按照语法推演一下你的代码。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文