手写简单的promise

24 篇文章 1 订阅
export class newPromise {
    constructor(executor) {//new 实例 传入一个函数
        executor(this.resolve, this.reject)
    }
    status = PENDING
    res = undefined
    result = undefined
    resolve = (value) => {//resolve方法 将pendding 变成fulfilled
        if(this.status !== PENDING) return
        this.status = FULFILLED
        this.res = value
    }
    reject = result => {//reject 方法:将pendding 变成reject
        if(this.status !==PENDING) return
        this.status = REJECTED
        this.result = result
    }
    then = (successCallback,failCallBack) => {//then方法
        if(this.status === FULFILLED) {
            successCallback(this.value)
        }else if(this.status == REJECTED) {
            failCallBack(this.result)
        }
    }
}

Promise 新建后就会立即执行。then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,

上面代码中,promise抛出一个错误,就被catch()方法指定的回调函数捕获。注意,上面的写法与下面两种写法是等价的。

// 写法一
const promise = new Promise(function(resolve, reject) {
  try {
    throw new Error('test');
  } catch(e) {
    reject(e);
  }
});
promise.catch(function(error) {
  console.log(error);
});

// 写法二
const promise = new Promise(function(resolve, reject) {
  reject(new Error('test'));
});
promise.catch(function(error) {
  console.log(error);
});
const someAsyncThing = function() {
  return new Promise(function(resolve, reject) {
    // 下面一行会报错,因为x没有声明
    resolve(x + 2);
  });
};

someAsyncThing().then(function() {
  console.log('everything is great');
});

setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123
上面代码中,someAsyncThing()函数产生的 Promise 对象,内部有语法错误。浏览器运行到这一行,会打印出错误提示ReferenceError: x is not defined,但是不会退出进程、终止脚本执行,2 秒之后还是会输出123。这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。
p = Promise.all方法: 将多个promise实例 包装成一个新的promise 实例
接受一个数组作为参数
两种情况: 
	只有当素有状态都变成fulfilled p 才会变成fulfilled 返回一个数组
	只要有一个别 rejected  p 就变成  reject 第一个失败的被返回

p = Promise.rece() jiang duoge pormise 实例 包装成一个新的pormise实例
	只要有一个实例改变状态 p 的状态就跟着高边,率先改变的实例返回值
	参数方法和promise.all() yiyang  rug bushi pormise 实例 就会先调用 Promise.reoslve() 方法 将参数转为 Promise 实例 在进一步处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RxnNing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值