手写promise自定义封装异步任务回调的执行

简介: 手写promise自定义封装异步任务回调的执行

自定义封装异步任务回调的执行


<script type="text/javascript">
    let p = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('err');
        }, 1000)
    })
    // 这个then方法是由p这个promise调用的
    p.then(res => {
        console.log('res', res)
    }, err => {
        console.log(err)
    })
</script>


我们发现 1s 后并没有输出内容值


为什么回调没有去执行呢?


因为代码从上往下执行的时候


setTimeout(() => {
    reject('err');
}, 1000)是一个异步的;


然后去执行下面的代码,它是不会去等待异步的哈~


去执行下面的同步代码


p.then(res => {
    console.log('res', res)
}, err => {
    console.log(err)
})


然后去调用了p的then方法;


我们到知道,p的状态一直没有发生改变;


一直是pedding


而我们封装的Promise中的then方法中没有对pedding判定进行判断


状态一直没有发生变化


所以一直是无法输出内容


如何解决上面遇见的问题


我们现在要解决,1s后的成功回调这个问题;


我们知道,状态的改变是在resolve和reject中


所以,我们是要在对应的函数中去处理这个问题的哈


首先保存成功或者失败后的回调函数


<script src="./Promise.js"></script>
<script type="text/javascript">
    let p = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('err');
        }, 1000)
    })
    // 这个then方法是由p这个promise调用的
    p.then(res => {
        console.log('res', res)
    }, err => {
        console.log(err)
    })
    console.log(p)  //此时是可以输出保存的回调函数的哈
</script>


function Promise(executor){
    const self=this;
    function resolve(data){
        // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);
        if( self.PromiseStatus!=='pending') return
        self.PromiseStatus='resolved';
        self.PromiseValue=data;
    }
    // 同样声明成为一个函数;修改状态
    function reject(err){
        // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);
        if( self.PromiseStatus!=='pending') return
        self.PromiseStatus='rejected';
        self.PromiseValue=err;
    }
    this.PromiseStatus ='pending' ;
    this.PromiseValue =null;
    // 声明属性  -----提供后面的成功或者失败后回调函数的使用
    this.callBack={};
    // 对异常进行处理;使用try catch
    try{
        executor(resolve,reject);
    }catch(err){
        reject(err);
    }
}
// 自定义封装then方法执行回调
Promise.prototype.then=function(onResolve,onReject){
    //{PromiseStatus:"resolved"PromiseValue:"ok"}
    if(this.PromiseStatus==='resolved'){
        onResolve(this.PromiseValue)
    }
    if(this.PromiseStatus==='rejected'){
        onReject(this.PromiseValue)
    }
    // 如果是pending的状态
    if(this.PromiseStatus==='pending'){
        // 这个是保存回调函数
        this.callBack={
            onResolve:onResolve,
            onReject:onReject
        }
    }
}


这个时候,我们打印 p


我们是知道 callBack 是有回调函数的;


自定义封装异步任务回调的执行(完整篇)


<script src="./Promise.js"></script>
<script type="text/javascript">
    let p = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('err');
        }, 1000)
    })
    // 这个then方法是由p这个promise调用的
    p.then(res => {
        console.log('res', res)
    }, err => {
        console.log(err)
    })
    console.log(p)
</script>


function Promise(executor){
    const self=this;
    function resolve(data){
        // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);
        if( self.PromiseStatus!=='pending') return
        self.PromiseStatus='resolved';
        self.PromiseValue=data;
        // 调用成功的回调函数
        if(self.callBack.onResolve){
            self.callBack.onResolve(data)
        }
    }
    // 同样声明成为一个函数;修改状态
    function reject(err){
        // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);
        if( self.PromiseStatus!=='pending') return
        self.PromiseStatus='rejected';
        self.PromiseValue=err;
        // 调用失败的回调函数
        if(self.callBack.onReject){
            self.callBack.onReject(err)
        }
    }
    this.PromiseStatus ='pending' ;
    this.PromiseValue =null;
    // 声明属性 ,提供后面的成功或者失败后回调函数的使用
    this.callBack={};
    // 对异常进行处理;使用try catch
    try{
        executor(resolve,reject);
    }catch(err){
        reject(err);
    }
}
// 自定义封装then方法执行回调
Promise.prototype.then=function(onResolve,onReject){
    //{PromiseStatus:"resolved"PromiseValue:"ok"}
    if(this.PromiseStatus==='resolved'){
        onResolve(this.PromiseValue)
    }
    if(this.PromiseStatus==='rejected'){
        onReject(this.PromiseValue)
    }
    // 如果是pending的状态
    if(this.PromiseStatus==='pending'){
        // 这个是保存回调函数
        this.callBack={
            onResolve:onResolve,
            onReject:onReject
        }
    }
}


我学到的东西;
原来可以这样将回调函数保存起来
// 声明属性 ,提供后面的成功或者失败后回调函数的使用
 this.callBack={};
// 这个是保存回调函数
this.callBack={
    onResolve:onResolve,
    onReject:onReject
}
// 调用成功的回调函数
if(self.callBack.onResolve){
    self.callBack.onResolve(data)
}


相关文章
|
1月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
22 1
|
1月前
|
JavaScript 前端开发
如何处理 Vue 中的异步操作和 Promise?
如何处理 Vue 中的异步操作和 Promise?
90 1
|
12天前
|
JSON 前端开发 JavaScript
ES6引入Promise和async/await解决异步问题
【6月更文挑战第12天】ES6引入Promise和async/await解决异步问题。Promise处理异步操作,有pending、fulfilled、rejected三种状态,支持链式调用和并行处理。async/await是基于Promise的语法糖,使异步代码更同步化,提高可读性。两者都是处理回调地狱的有效工具,开发者应根据需求选择合适的方式。
37 3
|
1月前
|
前端开发 JavaScript 安全
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
|
1月前
|
前端开发 JavaScript
掌握 Promise.all:优雅处理多个异步操作
掌握 Promise.all:优雅处理多个异步操作
|
1月前
|
前端开发 JavaScript UED
使用Promise或者async/await处理游戏中的异步操作。
JavaScript中的Promise和async/await常用于处理游戏开发中的异步操作,如加载资源、网络请求和动画帧更新。Promise代表异步操作的结果,通过.then()和.catch()处理回调。async/await提供了一种更简洁的语法,使异步代码看起来更同步。在游戏循环中,使用async/await管理资源加载可提高代码可读性,但需注意避免阻塞UI线程,并妥善处理加载顺序、错误和资源管理,以保证游戏性能和稳定性。
23 2
|
1月前
|
前端开发 JavaScript
js开发:请解释Promise是什么,以及它如何解决回调地狱(callback hell)问题。
Promise是JavaScript解决异步操作回调地狱的工具,代表未来可能完成的值。传统的回调函数嵌套导致代码难以维护,而Promise通过链式调用`.then()`和`.catch()`使异步流程清晰扁平。每个异步操作封装为Promise,成功时`.then()`传递结果,出错时`.catch()`捕获异常。ES6的`async/await`进一步简化Promise的使用,使异步代码更接近同步风格。
38 1
|
1月前
|
前端开发 安全
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
|
1月前
|
前端开发 JavaScript
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
35 4
|
1月前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:Promise 和 Async/Await
在现代的 JavaScript 开发中,异步编程是至关重要的。本文将介绍 JavaScript 中的异步编程概念,重点讨论 Promise 和 Async/Await 这两种常见的处理异步操作的方法。通过本文的阐述,读者将能够更好地理解和应用这些技术,提高自己在 JavaScript 开发中处理异步任务的能力。