手写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)
}
手写promise自定义封装异步任务回调的执行的更多相关文章
- 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)
MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...
- 手写Promise A+ 规范
基于ES6语法手写promise A+ 规范,源码实现 class Promise { constructor(excutorCallBack) { this.status = 'pending'; ...
- 手写Promise中then方法返回的结果或者规律
1. Promise中then()方法返回来的结果或者规律 我们知道 promise 的 then 方法返回来的结果值[result]是由: 它指定的回调函数的结果决定的 2.比如说下面这一段代码 l ...
- 手写promise
写在前面: 在目前的前端分开中,我们对于异步方法的使用越来越频繁,那么如果处理异步方法的返回结果,如果优雅的进行异步处理对于一个合格的前端开发者而言就显得尤为重要,其中在面试中被问道最多的就是对Pro ...
- 手写Promise看着一篇就足够了
目录 概要 博客思路 API的特性与手写源码 构造函数 then catch Promise.resolved Promise.rejected Promise.all Promise.race 概要 ...
- 前端面试题之手写promise
前端面试题之Promise问题 前言 在我们日常开发中会遇到很多异步的情况,比如涉及到 网络请求(ajax,axios等),定时器这些,对于这些异步操作我们如果需要拿到他们操作后的结果,就需要使用到回 ...
- 手写Promise原理
我的promise能实现什么? 1:解决回调地狱,实现异步 2:可以链式调用,可以嵌套调用 3:有等待态到成功态的方法,有等待态到失败态的方法 4:可以衍生出周边的方法,如Promise.resolv ...
- js同步、异步、回调的执行顺序以及闭包的理解
首先,记住同步第一.异步第二.回调最末的口诀 公式表达:同步=>异步=>回调 看一道经典的面试题: for (var i = 0; i < 5; i++) { setTimeout( ...
- 手写promise解决回调地狱问题
在介绍promise之前我们先来看一段代码: 根据案例我们可以看出,这段代码可以无限的嵌套下去,但是每嵌套一层,代码的运行就会降低,而解决回调地狱最好的办法就是new promise 一.什么是 pr ...
- 手写Promise简易版
话不多说,直接上代码 通过ES5的模块化封装,向外暴露一个属性 (function(window){ const PENDING = 'pending'; const RESOLVED = 'fulf ...
随机推荐
- 基于Serverless的端边云一体化媒体网络
摘要:视频在边缘的创新方向在哪?下一代视频云平台什么样? 本文分享自华为云社区<探讨视频云与边缘云平台的竞争力--基于Serverless的端边云一体化媒体网络>,作者/卢志航,整理 / ...
- AtCoder Beginner Contest 335 总结
ABC335总结 A.202<s>3</s> 翻译 给你一个由小写英文字母和数字组成的字符串 \(S\). \(S\) 保证以 2023 结尾. 将 \(S\) 的最后一个字符 ...
- 让 ChatGPT 如虎添翼 2.0
月初写了4个工具,让 ChatGPT 如虎添翼!,时隔二十多天,我又发现了基于ChatGPT的应用,只推最好用的,强烈建议大家都感受一下. 极简搭建 ChatGPT 演示网页 项目地址:https:/ ...
- 命令行状态下切换盘符 cd 跨盘
这个经常忘记,在这记下来 cd /d d: 就是加上/d参数
- redis管道技术pipeline二——api
package spring.redis; import org.springframework.beans.factory.InitializingBean; import org.springfr ...
- 使用屏幕捕捉API:一站式解决屏幕录制需求
随着科技的发展,屏幕捕捉API技术逐渐成为一种热门的录屏方法.本文将详细介绍屏幕捕捉API技术的原理.应用场景以及如何利用这一技术为用户提供便捷.高效的录屏体验. 在线录屏 | 一个覆盖广泛主题工具的 ...
- vue中引入其他网站页面
https://blog.csdn.net/qq_36706878/article/details/102593309
- node-sass安装失败问题
在node 中安装sass依赖总会出现各种各样的问题,第一次遇见这样的问题 Cached binary found at C:\Users\ltzhouhuan\AppData\Roaming\npm ...
- javaweb 项目!号 解决方案
1:右击项目工程名称2:Properties3: Jvav Build Path4: Libraries5: Add External JARS6: 找到"E:\apache-tom ...
- CSS - 滤镜的妙用 - 制作炫彩圆环(外加动画)
效果图如下: 话不多说,上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...