Promise--关键问题

为什么用promise

1、支持链式调用,可以解决回调地狱问题
2、指定回调函数的方式更加灵活

可封装一个异步操作,获取其成功和失败的值

异步编程

  • fs文件操作
  • 数据库操作
  • AJAX
  • 定时器

Promise 关键问题----如何中断 Promise 链

<script>
       let p = new Promise((resolve,reject)=>{
           setTimeout(()=>{
               resolve("ok");
           },1000)
       })
       p.then(value=>{
            console.log(111);
       }).then(value=>{
           console.log(2222);
       }).then(value=>{
           console.log(333333);
       }).catch(reason=>{
           console.warn(reason);
       })
    </script>

结果如图所示:
在这里插入图片描述
如果我们只想得到前两个的输出值,则有且仅有一种方法:添加一个等待状态(pending状态)的Promise
即:

  <script>
       let p = new Promise((resolve,reject)=>{
           setTimeout(()=>{
               resolve("ok");
           },1000)
       })
       p.then(value=>{
            console.log(111);
       }).then(value=>{
           console.log(2222);
           return new Promise(()=>{})   //添加一个等待状态的Promise
       }).then(value=>{
           console.log(333333);
       }).catch(reason=>{
           console.warn(reason);
       })
    </script>

结果如图:
在这里插入图片描述

Promise 的自定义封装

<script src="./promise.js"></script>
    <script>
       let p = new Promise((resolve,reject)=>{
            //    resolve("ok");
            reject('ggg')
            // throw "error"
       });
       console.log(p);
       p.then(value=>{
            console.log(value);
       },reason=>{
           console.log(reason);
       })
    </script>

分别声明构造函数以及then方法

// 声明构造函数
function Promise(executor) {
    // 添加属性
    this.PromiseState = 'pending';
    this.PromiseResult = null;

    // 保存实例对象的 this 值
    const self = this;

    // resolve函数
    function resolve(data) {
        // 判断状态
        if(self.PromiseState !== 'pending') return;
        // 改变对象状态  promisestate
        self.PromiseState = 'fulfilled';
        // 设置对象结果值  promiseresult
        self.PromiseResult = data;
    }
    // reject函数
    function reject(data) {
        if(self.PromiseState !== 'pending') return;
        // 改变对象状态  promisestate
        self.PromiseState = 'rejected';
        // 设置对象结果值  promiseresult
        self.PromiseResult = data;
    }
// throw功能实现
    try {
        // 同步调用[执行器函数]
        executor(resolve, reject);
    } catch (e) {
        // 修改 promise 状态为失败
        reject(e)
    }
}

// 添加then方法
Promise.prototype.then = function (onResolved, onRejected) {

    // 调用回调函数
    if(this.PromiseState === "fulfilled"){
        onResolved(this.PromiseResult);
    }
    if(this.PromiseState === "rejected"){
        onRejected(this.PromiseResult);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值