刘建状 2022-09-06 16:57 采纳率: 75%
浏览 49
已结题

js Promise问题

js关于Promise问题
问题代码
             let p1 = new Promise((resolve,reject)=>{
                resolve();
            });

            let p2 = p1.then(()=>{
                console.log("哈哈哈哈");
            })

            p2.then(()=>{
                console.log(111111);
            })
  
            // 这里p1状态为 fulfilled
            1. console.log(p1);    
            
            // 这里p2状态为 pending
            1. console.log(p2);

            // 而在定时器中 
            setTimeout(()=>{

                // p1结果没有变化
                console.log(p1);

                // 而 p2的状态改为了 fulfilled 
                console.log(p2);
            })
我想知道p2的一个执行过程,或者说是为什么
我不知道我理解的正不正确,我这里相的是, 因为Promise是异步的, 所以代码先执行了不在定时器当中的打印,也就是标注为1的位置,而p1呢是存在resolve的所以p1的状态为fulfilled,而p2呢所实在的我没有理解到,但是我猜测,因为p2 是p1.then的一个处理结果,而p1.then又返回了个新的promise ,这个新的promise 没有进行任何操作,所以这里p2 的状态为pending。
而这时呢,除了定时器中所有代码都已经执行完成,这回处理定时器中的p1的结果没有发生变化,而p2在上面代码中进行了.then操作,虽说在.then里面什么也没有操作,但是因为 默认then 返回promise状态是fulfied,

所以说在定时器中p2的结果发生了变化

  • 写回答

2条回答 默认 最新

  • 蛙夏~ 2022-09-07 11:52
    关注
        // p1执行resolve,p1:fulfilled
        let p1 = new Promise((resolve, reject) => {
          resolve();
        });
    
        // 返回了一个新的promise,p2:pending
        let p2 = p1.then(() => {
          console.log("****3****", "哈哈哈哈");
        });
    
        // p2执行resolve,p2:fulfilled
        p2.then(() => {
          console.log("****4****", 111111);
        });
    
        // p1:fulfilled
        console.log("****1****", p1);
    
        // p2:pending
        console.log("****2****", p2);
    
        // 而在定时器中
        setTimeout(() => {
          // p1:fulfilled
          console.log("****5****", p1);
    
          // p2:fulfilled
          console.log("****6****", p2);
        });
    
    

    与执行顺序有关,先执行Promise和setTimeout外的输出,再执行Promise的输出,最后执行setTimeout里的输出。
    promise本身同步的,.then方法是异步的。new Promise是pending, Promise执行resolve会由pending->fulfilled,执行rejected会由pending->rejected,且三种状态不可逆

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月25日
  • 已采纳回答 7月17日
  • 修改了问题 9月6日
  • 修改了问题 9月6日
  • 展开全部

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b