如何自定义Promise函数与详细讲解

自定义Promise函数

  • 改变Promise的状态有 三种方式

    • resolve(),reject(),抛出异常
    • Promise的状态只能修改一次
    • Promise的then方法当中去执行回调
    • 异步任务 then 的 方法实现
    • 指定多个回调
    • 同步任务下then方法返回结果的实现
    • catch方法与异常穿透
    • Promise resolve方法封装
    • Promise reject方法封装
    • Promise all 方法封装
    • Promise race 方法封装
    • then指定的回调函数异步执行
      
      //声明构造函数
      function Promise(executor) {
      //给Promise对象添加属性
      this.PromiseState="pending";//默认值 pending
      this.PromiseResult=null;
      //声明属性来实现异步then的方法
      this.callbacks = [];
      //保存Promise实例对象 this 的值
      const self = this;

    // 声明成功时回调的resolve函数
    function resolve(data){
    //判断Promise的状态是否已经被修改 ,被修改就不能再次修改了 保证Promise的状态只能修改一次
    if(self.PromiseState !=='pending') return;
    //1.修改Promise对象的状态(promiseState)
    self.PromiseState = 'fulfilled';//成功:resolved、fulfilled
    //2.设置Promise对象结果值(promiseResult)
    self.PromiseState = data;

    //then指定的回调函数异步执行
    setTimeout(() => {
        // 调用成功的回调   来实现异步then的方法
        self.callbacks.forEach(item => {
            item.onResolved(data);
        });
    })

    }

    //声明失败时回调的reject函数
    function reject(data){
    //判断Promise的状态是否已经被修改 ,被修改就不能再次修改了 保证Promise的状态只能修改一次
    if(self.PromiseState !=='pending') return;
    //1.修改Promise对象的状态(promiseState)
    self.PromiseState = 'rejected';//失败:rejected
    //2.设置Promise对象结果值(promiseResult)
    self.PromiseState = data;
    //then指定的回调函数异步执行
    setTimeout(() => {
    // 调用失败的回调 来实现异步then的方法
    self.callbacks.forEach(item => {
    item.onRejected(data);
    });
    })

    }

    //抛出异常
    try {
    //同步调用【执行函数】
    executor(resolve,reject);
    } catch (error) {
    //修改Promise对象的状态为【失败】
    reject(error)
    }

}

//添加函数Promise的 then 方法
Promise.prototype.then =function(onResolved,onRejected){
const self = this;

//判断回调函数参数
if(typeof onRejected !== "function"){
    onRejected = reason=>{
        throw reason;
    }
}   
if(typeof onResolved !== "function"){
    onResolved = value =>value;
    // onResolved = value=>{
    //     return value;
    // }
}   
return new Promise((resolve,reject)=>{
    //封装公用函数
    function callback(type){
         try {
            //获取回调函数的执行结果
            let result = type(self.PromiseResult);//传递结果值
            //判断 是否Promise 的对象
            if(result instanceof Promise){
                //如果是Promise类型的对象 可以调then 的方法
                result.then(v=>{
                    resolve(v);
                },r=>{
                    reject(r);
                })
            }else{
                //结果的对象状态为成功
                resolve(result);
            }
        } catch (error) {
            reject(error);
        }
    }

    //调用回调函数
    //1.判断成功调用onResolved
    if(this.PromiseState === "fulfilled"){
        //then指定的回调函数异步执行
        setTimeout(() => {
            callback(onResolved);
        });

    }
    //2.判断失败调用onRejected
    if(this.PromiseState === "rejected"){
        //then指定的回调函数异步执行
        setTimeout(()=>{
            callback(onRejected);            
        })

    }

    //Promise异步任务 then 的 方法实现
    //1.判断 pengding的状态
    if(this.PromiseState === 'pending'){
        //状态不确定 保存回调函数
        this.callbacks.push({
            onResolved:function(){
                callback(onResolved);                   
            },
            onRejected:function(){
                callback(onRejected);                    
            }
        })
    }
})

}

//添加catch 方法
Promise.prototype.catch = function(onRejected){
return this.then(undefined,onRejected);
}

//添加 resolve 方法 属于类 不是属于实例对象
Promise.resolve = function(value){
//返回Promise 对象
return new Promise((resolve,reject)=>{
if(value instanceof Promise){
value.then(v=>{
resolve(v);
},r=>{
reject(r);
})
}else{
//状态设置为成功
resolve(value);
}
})
}

//添加 Promise.reject 方法 属于类 不是属于实例对象
Promise.reject = function(reason){
//返回Promise 对象
return new Promise((resolve,reject)=>{
reject(reason);
})
}
//添加 Promise.all方法的封装 属于类 不是属于实例对象
Promise.all = function(promise){
//返回的结果是一个Promise对象
return new Promise((resolve,reject)=>{
//声明计数变量
let count = 0;
//声明成功存发的数据
let successResultArr = [];
for(let i=0;i<promise.length;i++){
promise[i].then(v={
//得知这个对象的状态时成功的
//每个promise对象成功才能调
count++;
//将当前成功的结果存入到数组中
successResultArr[i] = v;
if(count === promise.length){
resolve(successResultArr);
}
},r=>{
reject(r);
})
}
})
}

//添加 reject方法封装 属于类 不是属于实例对象
Promise.race = function(promise){
return new Promise((resolve,reject)=>{
for(let i=0;i<promise.length;i++){
promise[i].then(v={
//修改返回对象的状态为【成功】
resolve(v)
},r=>{
//修改返回对象的状态为【失败】
reject(r);
})
}
})
}

//给Promise 封装成一个类
class Promise{

//构造方法
constructor(executor){
    //给Promise对象添加属性
    this.PromiseState="pending";//默认值 pending
    this.PromiseResult=null;
    //声明属性来实现异步then的方法
    this.callbacks = [];
    //保存Promise实例对象 this 的值
    const self = this;

    // 声明成功时回调的resolve函数
    function resolve(data){
        //判断Promise的状态是否已经被修改 ,被修改就不能再次修改了 保证Promise的状态只能修改一次
        if(self.PromiseState !=='pending') return;
        //1.修改Promise对象的状态(promiseState)
        self.PromiseState = 'fulfilled';//成功:resolved、fulfilled
        //2.设置Promise对象结果值(promiseResult)
        self.PromiseState = data;

        //then指定的回调函数异步执行
        setTimeout(() => {
            // 调用成功的回调   来实现异步then的方法
            self.callbacks.forEach(item => {
                item.onResolved(data);
            });
        })

    }

    //声明失败时回调的reject函数
    function reject(data){
        //判断Promise的状态是否已经被修改 ,被修改就不能再次修改了 保证Promise的状态只能修改一次
        if(self.PromiseState !=='pending') return;
        //1.修改Promise对象的状态(promiseState)
        self.PromiseState = 'rejected';//失败:rejected
        //2.设置Promise对象结果值(promiseResult)
        self.PromiseState = data;
        //then指定的回调函数异步执行
        setTimeout(() => {
            // 调用失败的回调   来实现异步then的方法
            self.callbacks.forEach(item => {
                item.onRejected(data);
            });
        })

    }

    //抛出异常
    try {
        //同步调用【执行函数】
        executor(resolve,reject);
    } catch (error) {
        //修改Promise对象的状态为【失败】
        reject(error)
    }
}

//then 方法的封装
then(onResolved,onRejected){
    const self = this;

    //判断回调函数参数
    if(typeof onRejected !== "function"){
        onRejected = reason=>{
            throw reason;
        }
    }   
    if(typeof onResolved !== "function"){
        onResolved = value =>value;
        // onResolved = value=>{
        //     return value;
        // }
    }   
    return new Promise((resolve,reject)=>{
        //封装公用函数
        function callback(type){
            try {
                //获取回调函数的执行结果
                let result = type(self.PromiseResult);//传递结果值
                //判断 是否Promise 的对象
                if(result instanceof Promise){
                    //如果是Promise类型的对象 可以调then 的方法
                    result.then(v=>{
                        resolve(v);
                    },r=>{
                        reject(r);
                    })
                }else{
                    //结果的对象状态为成功
                    resolve(result);
                }
            } catch (error) {
                reject(error);
            }
        }

        //调用回调函数
        //1.判断成功调用onResolved
        if(this.PromiseState === "fulfilled"){
            //then指定的回调函数异步执行
            setTimeout(() => {
                callback(onResolved);
            });

        }
        //2.判断失败调用onRejected
        if(this.PromiseState === "rejected"){
            //then指定的回调函数异步执行
            setTimeout(()=>{
                callback(onRejected);            
            })

        }

        //Promise异步任务 then 的 方法实现
        //1.判断 pengding的状态
        if(this.PromiseState === 'pending'){
            //状态不确定 保存回调函数
            this.callbacks.push({
                onResolved:function(){
                    callback(onResolved);                   
                },
                onRejected:function(){
                    callback(onRejected);                    
                }
            })
        }
    })
}

//catch 方法封装
catch(onRejected){
    return this.then(undefined,onRejected);
}

//添加 resolve 方法 属于类 不是属于实例对象 所以用 static 来修饰 表示静态成员
static resolve(value){
    //返回Promise 对象
    return new Promise((resolve,reject)=>{
        if(value instanceof Promise){
            value.then(v=>{
                resolve(v);
            },r=>{
                reject(r);
            })
        }else{
            //状态设置为成功
            resolve(value);
        }
    })
}

//添加 Promise.reject 方法 属于类 不是属于实例对象
static reject(reason){
    //返回Promise 对象
    return new Promise((resolve,reject)=>{
        reject(reason);         
    })
}
//添加 Promise.all方法的封装 属于类 不是属于实例对象
static all(promise){
    //返回的结果是一个Promise对象
    return new Promise((resolve,reject)=>{
        //声明计数变量
        let count = 0;
        //声明成功存发的数据
        let successResultArr = [];
        for(let i=0;i<promise.length;i++){
            promise[i].then(v={
                //得知这个对象的状态时成功的
                //每个promise对象成功才能调
                count++;
                //将当前成功的结果存入到数组中
                successResultArr[i] = v;
                if(count === promise.length){
                    resolve(successResultArr);
                }
            },r=>{
                reject(r);
            })
        }
    })
}

//添加 reject方法封装 属于类 不是属于实例对象
static race(promise){
    return new Promise((resolve,reject)=>{        
        for(let i=0;i<promise.length;i++){
            promise[i].then(v={
                //修改返回对象的状态为【成功】
                resolve(v)
            },r=>{
                //修改返回对象的状态为【失败】
                reject(r);
            })
        }
    })
}

}


## async 函数
-   函数的返回值 为 Promise 对象
-   promise 对象的结果有async 函数执行的返回决定
```javascript
    async function mian(){

    }

await 表达式

  • await 右侧的表达式一般为promise对象,但是也可以时其它的值
  • 如果表达式是promise对象,await 返回的是promise成功的值
  • 如果表达式时其他的值,直接将此值作为await的的返回值

    注意:await 必须写在async 函数中,但 async函数中可以没有await
    如果await 的promise 失败了,就会抛出异常,需要通过try...catch捕获处理

    
    async ffunction main(){
    let p = new Promise((resolve,reject)=>{
        //resolve('OK');
        reject('error');
    })
    //1.右侧为promise的情况
    // let p res = await p;// 返回结果为OK
    //2. 右侧为其他类型的数据
    // let res2 = await 20;//返回结果值为20
    // 3.如果promise 是失败的状态
    try {
        let res3 = await p;
    } catch (error) {
        console.log(error);
    }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
写一个 Promise 函数需要遵循以下步骤: 1. 创建 Promise 实例,传入一个函数作为参数,该函数接收两个参数(resolve, reject)。 2. 在 Promise 函数中编写异步操作的代码,一般是通过定时器模拟异步操作,或者通过 Ajax、Websocket 等方式与服务器进行通信。 3. 在异步操作成功时,调用 resolve 函数并传入异步操作的结果,表示 Promise 对象的状态变为 resolved。 4. 在异步操作失败时,调用 reject 函数并传入错误信息,表示 Promise 对象的状态变为 rejected。 5. 在 Promise 实例上调用 then 方法,传入一个回调函数作为参数,回调函数接收一个参数作为异步操作的结果,可以对异步操作的结果进行处理。 6. 在 Promise 实例上调用 catch 方法,传入一个回调函数作为参数,回调函数接收一个参数作为错误信息,可以对异步操作的错误进行处理。 下面是一个简单的 Promise 函数示例: ```javascript function myPromise() { // 创建 Promise 实例 return new Promise(function(resolve, reject) { // 异步操作 setTimeout(function() { // 模拟异步操作成功 resolve('异步操作成功'); // 模拟异步操作失败 // reject('异步操作失败'); }, 1000); }); } // 调用 Promise 函数 myPromise().then(function(result) { console.log(result); // 异步操作成功 }).catch(function(error) { console.log(error); // 异步操作失败 }); ``` 在上面的示例中,myPromise 函数返回一个 Promise 实例,在 Promise 实例中通过定时器模拟了一个异步操作,1 秒后调用 resolve 函数表示异步操作成功。调用 then 方法并传入一个回调函数,当异步操作成功时,回调函数会被调用并接收异步操作的结果。如果异步操作失败,则调用 catch 方法并传入一个回调函数,回调函数会被调用并接收错误信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值