自定义封装异步任务回调的执行
<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)
}

手写promise自定义封装异步任务回调的执行的更多相关文章

  1. 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)

    MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...

  2. 手写Promise A+ 规范

    基于ES6语法手写promise A+ 规范,源码实现 class Promise { constructor(excutorCallBack) { this.status = 'pending'; ...

  3. 手写Promise中then方法返回的结果或者规律

    1. Promise中then()方法返回来的结果或者规律 我们知道 promise 的 then 方法返回来的结果值[result]是由: 它指定的回调函数的结果决定的 2.比如说下面这一段代码 l ...

  4. 手写promise

    写在前面: 在目前的前端分开中,我们对于异步方法的使用越来越频繁,那么如果处理异步方法的返回结果,如果优雅的进行异步处理对于一个合格的前端开发者而言就显得尤为重要,其中在面试中被问道最多的就是对Pro ...

  5. 手写Promise看着一篇就足够了

    目录 概要 博客思路 API的特性与手写源码 构造函数 then catch Promise.resolved Promise.rejected Promise.all Promise.race 概要 ...

  6. 前端面试题之手写promise

    前端面试题之Promise问题 前言 在我们日常开发中会遇到很多异步的情况,比如涉及到 网络请求(ajax,axios等),定时器这些,对于这些异步操作我们如果需要拿到他们操作后的结果,就需要使用到回 ...

  7. 手写Promise原理

    我的promise能实现什么? 1:解决回调地狱,实现异步 2:可以链式调用,可以嵌套调用 3:有等待态到成功态的方法,有等待态到失败态的方法 4:可以衍生出周边的方法,如Promise.resolv ...

  8. js同步、异步、回调的执行顺序以及闭包的理解

    首先,记住同步第一.异步第二.回调最末的口诀 公式表达:同步=>异步=>回调 看一道经典的面试题: for (var i = 0; i < 5; i++) { setTimeout( ...

  9. 手写promise解决回调地狱问题

    在介绍promise之前我们先来看一段代码: 根据案例我们可以看出,这段代码可以无限的嵌套下去,但是每嵌套一层,代码的运行就会降低,而解决回调地狱最好的办法就是new promise 一.什么是 pr ...

  10. 手写Promise简易版

    话不多说,直接上代码 通过ES5的模块化封装,向外暴露一个属性 (function(window){ const PENDING = 'pending'; const RESOLVED = 'fulf ...

随机推荐

  1. 可视大盘 + 健康分机制,火山引擎 DataLeap 为企业降低资源优化门槛!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着数仓及研发技术团队维护的数据量大.资源使用量大.成本越高.优化压力越大.如何主动发现无效或低效使用的资源,并且 ...

  2. 打通数据治理全链路,火山引擎DataLeap数据治理平台公有云版本正式发布

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   近日,火山引擎DataLeap正式对外发布数据治理平台公有云版.DataLeap是火山引擎大数据研发治理套件, ...

  3. PPT 毕业答辩PPT应该怎么样改

    PPT 毕业答辩PPT应该怎么样改

  4. Hugging News #0203: 3.3 MB 的文生图模型、RHLF 训练框架、手机上能跑的 Transformer

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  5. Android 黑马 52 期视频,不加密,免费下载

    Android 黑马学习视频 目录 01.安卓基础+JNI (14天) 02.Android应用开 发-代码版本管理和实战(1天) 03.android案 例与项目_手机安全卫士(12天) 04.自定 ...

  6. es报错记录

    ElasticsearchException[failed to bind service]; nested: AccessDeniedException[/usr/share/elasticsear ...

  7. SpringCloud学习 系列三、 创建一个没有使用springCloud的服务提供者和消费者

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  8. lin UI微信小程序组件库

    https://doc.mini.talelin.com/start/ 所在文件夹,npm init 安装组件库, npm i lin-ui@0.8.7 选择"工具-构建npm".

  9. 扒一扒ProcessOn 新功能——一键编号、图形组合、左侧导航、画布水印、表格组件

    思维导图.一键编号 思维导图新增 多种全新主题风格,让您的创作赏心悦目 思维导图新增 一键编号 功能 流程图.图形组合 自定义组合图形功能:新增流程图 我的图形 功能,用户可以设置或者上传自己的图形 ...

  10. java进阶(32)--Collections工具类

    一.简介:Collection与Collections区别 1.Java.until.Collection是集合接口 2.Java.until.Collections是集合工具类,方便集合的操作 二. ...