请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师catch和then的第二个参数处理是不是有问题啊?

因为catch和then的第二个参数,是处理rejected状态的,但是它默认返回的应该是resolved啊。老师这里reject(newReason);不是又返回rejected的状态吗?
还有如果老师我这样理解是对的话pending里面该怎么改呢?

    then(fn1, fn2) {
        // 判断fn1, fn2是不是函数
        fn1 = typeof fn1 === 'function' ? fn1 : (v) => v;
        fn2 = typeof fn2 === 'function' ? fn2 : (e) => e;

        if (this.state === 'pending') {
            // 当pending状态下,fn1和fn2会存储到callbacks中
            return new MyPromise((resolve, reject) => {
                this.resolveCallbacks.push(() => {
                    try {
                        const newValue = fn1(this.value);
                        resolve(newValue);
                    } catch (error) {
                        reject(error);
                    }
                })
                this.rejectCallbacks.push(() => {
                    try {
                        const newReason = fn2(this.reason);
                        reject(newReason);
                    } catch (error) {
                        reject(error);
                    }
                })
            })
        }

        if (this.state === 'fulfilled') {
            // 要返回新的promise,传入当前的value,计算出新的value,resolve
            return new MyPromise((resolve, reject) => {
                try {
                    const newValue = fn1(this.value);
                    resolve(newValue);
                } catch (error) {
                    reject(error);
                }
            })
        }

        if (this.state === 'rejected') {
            // 要返回新的promise,传入当前的reason,生成新的reason,reject
            return new MyPromise((resolve, reject) => {
                try {
                    const newValue = fn2(this.reason);
                    resolve(newValue);  **//这里改为resolve**
                } catch (error) {
                    reject(error);
                }
            })
        }
    }
    // 就是then的语法糖 
    catch(fn) {
        return this.then(null, fn);
    }

正在回答 回答被采纳积分+3

2回答

笑着拍拍你的头 2022-04-19 18:44:00
1.把then里fn2判断改成fn2 = typeof fn2 === 'function' ? fn2 : (reason) => { throw reason }
2.把then里state = 'pending'里rejectCallbacks的reject改成resolve(newReason)
3.把then里state = 'rejected'里的reject改成resolve(newReason)


2 回复 有任何疑惑可以回复我~
双越 2021-10-22 08:51:04

把这里的 reject 替换为 resolve 即可

https://img1.sycdn.imooc.com//szimg/61720af309ed1b0f11521040.jpg

2 回复 有任何疑惑可以回复我~
  • 所以课程里就是写错了吧,得亏瞄了一眼问答区
    回复 有任何疑惑可以回复我~ 2021-11-03 20:56:01
  • 如果链式调用是这样的就不行了
    new mypromise((res,rej)=>{
      rej(1)
    }).then(data=>{
      console.log(1)
    }).catch(err=>{
      console.log(2)
      return 3
    }).then(data=>{
      console.log(data)   //此处打印1
    })
    回复 有任何疑惑可以回复我~ 2022-02-07 11:05:16
  • 1.把then里fn2判断改成fn2 = typeof fn2 === 'function' ? fn2 : (reason) => { throw reason }
    2.把then里state = 'pending'里rejectCallbacks的reject改成resolve(newReason)
    3.把then里state = 'rejected'里的reject改成resolve(newReason)
    回复 有任何疑惑可以回复我~ 2022-04-19 18:43:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信