实现如果下规范的promise
Aplus规范
1,promise是一个类:有三个状态 pending/等待态 fulfilled/成功态 rejected/失败态
2,promise默认执行器立即执行
3,Promise的实例都有一个then方法
4,执行器中用户可以自己决定成功或者失败,并且传入成功或者失败的原因
5,如果excutor执行器函数发生异常的时候也会执行失败的逻辑
6,如果Promise一旦进入成功态就不能再变为失败态,反之亦然
 
// 定义promise三种状态
let PENDING = 'PENDING'
let RESOLVED = 'RESOLVED' // 成功状态
let REJECTED = 'REJECTED' // 失败状态
console.log('own') const resolvePromise = (promise2, x, resolve, reject) => {
// A+规范中 x和promise2引用同一个对象抛出类型错误
if (promise2 === x) {
return reject(new TypeError('Chaining cycle detected for promise #<Promise>'))
}
// 后续的条件要严格判断 保证代码能和别的库一起使用
// x可能是一个函数或者对象
if ((typeof x === 'object' && x !== null) || typeof x === 'function') {
try {
let then = x.then;
if (typeof then === 'function') {
// 只能判断then是函数就认为其是promise
then.call(x, y => {
resolve(y)
}, e => {
reject(e)
})
} else {
resolve(x)
}
} catch (e) {
//TODO handle the exception
} } else {
resolve(x)
}
} class Promise {
constructor(excutor) {
this.status = PENDING
// 成功和失败的原因需要保存
this.value = undefined; // 成功的值
this.reason = undefined; // 失败的值
this.onResolvedCallbacks = []; // 存储成功的回调函数数组
this.onRejectedCallbacks = []; // 存储失败的回调函数数组
// 只有等待态的时候才能更改状态 let resolve = (value) => { if(value instanceof Promise){
value.then(resolve,reject) // 判断是promise.resolve 中如果传promise 递归解析 ,有延迟效果
} if (this.status = PENDING) {
this.value = value;
this.status = RESOLVED;
this.onResolvedCallbacks.forEach(fn => fn())
} }
let reject = (reason) => {
if (this.status = PENDING) {
this.reason = reason;
this.status = REJECTED;
this.onRejectedCallbacks.forEach(fn => fn())
}
}
// 当函数发生异常直接抛出错误
try {
excutor(resolve, reject)
} catch (e) {
reject(e)
}
}
// 关于then方法:
// 1: promise 成功或者失败会传递到外层的下一个then方法
// 2: 返回的是普通值(除了promise之外的值)都会触底到下一then的成功中;出错的情况走到下一次的失败中;
// 3: 错误处理 。自己最近的then没有错误处理,会向下传递错误直到有错误处理
// 4: 每次执行完then 返回都是新的promise (一旦成功或者失败就不能够修改状态)
then (onFulfilled, onRejected) { // 如果then中返回一个promise 我需要用x来决定是决定promise返回成功还是失败 let promise2 = new Promise((resolve, reject) => { // 链式调用
if (this.status === RESOLVED) {
setTimeout(() => { // 为了让resolvePromise拿到promise2
try {
// 如果状态是成功了,需要调用传入的第一个onFulfilled函数
let x = onFulfilled(this.value) //成功的回调直接执行;执行完成后拿到结果;ps: 成功之后返回的直接执行拿到结果存放到x中
// 但是返回的promise 还能继续then,继续传递成功的结果
// x可能是promise,解析promise ,使用这个返回的结果决定下一个then是成功还是失败
resolvePromise(promise2, x, resolve, reject) // 调用了下一个promise的resolve
} catch (error) {
reject(error)
} }, 0)
}
if (this.status === REJECTED) {
setTimeout(() => { // 为了让resolvePromise拿到promise2
try {
// 如果状态失败了,就需要使用第二个函数讲失败的原因返回
let x = onRejected(this.reason)
// 处理失败
resolvePromise(promise2, x, resolve, reject) //普通值都会传递到下一个的成功
} catch (error) {
reject(error)
} }, 0)
}
// 调用then的时候可能是pending状态
if (this.status === PENDING) {
this.onResolvedCallbacks.push(() => {
// todo
setTimeout(() => {
try {
let x = onFulfilled(this.value)
resolvePromise(promise2, x, resolve, reject)
} catch (error) {
reject(error)
}
}, 0) })
this.onRejectedCallbacks.push(() => {
// todo
setTimeout(() => {
try {
let x = onRejected(this.reason)
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error)
}
}, 0)
})
}
})
return promise2;
}
catch(errCallBack){
return this.then(null,errCallBack)
}
static resolve(data){
// 快速创建一个成功的promise
return new Promise((resolve,reject) => {
resolve(data)
})
}
static reject(reason){
// 快速创建一个失败的promise
return new Promise((resolve,reject) => {
reject(reason)
})
}
}

基于PromiseA+规范实现一个promise的更多相关文章

  1. Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)

    1.什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数 事件监听 发布/ ...

  2. 掘金转载-手写一个Promise

    目录 一 什么是Promise ? 二 Promises/A+ 规范 2.1 术语 2.2 基本要求 2.2.1. Promise的状态 2.2.2. Then 方法 2.3 简易版实践 2.4 进一 ...

  3. Promise A 规范的一个简单的浏览器端实现

    简单的实现了一个promise 的规范,留着接下来模块使用.感觉还有很多能优化的地方,有时间看看源码,或者其他大神的代码 主要是Then 函数.回调有点绕人. !(function(win) { fu ...

  4. 一步一步实现一个Promise A+规范的 Promise

    2015年6月,ES2015(即ES6)正式发布后受到了非常多的关注.其中很重要的一点是 Promise 被列为了正式规范. 在此之前很多库都对异步编程/回调地狱实现了类 Promise 的应对方案, ...

  5. 根据 Promise/A+ 和 ES6 规范,实现 Promise(附详细测试)

    Promise 源码 https://github.com/lfp1024/promise promise-a-plus const PENDING = 'PENDING' const REJECTE ...

  6. 教你一步一步实现一个Promise

    Promise我想现在大家都非常熟悉了,主要作用就是解决异步回调问题,这里简单介绍下. Promise规范是CommonJS规范之一,而Promise规范又分了好多种,比如 Promises/A.Pr ...

  7. 【原】手写一个promise

    上一篇文章中,我们介绍了Promise的基本使用,在这篇文章中,我们试着自己来写一个Promise,主要是学习Promise的内部机制,学习它的编程思想. !!!备注:本文写的不好,仅供自己学习之用, ...

  8. Promise原理—一步一步实现一个Promise

    promise特点 一个promise的当前状态只能是pending.fulfilled和rejected三种之一.状态改变只能是pending到fulfilled或者pending到rejected ...

  9. 前端笔记之ES678&Webpack&Babel(下)AMD|CMD规范&模块&webpack&Promise对象&Generator函数

    一.AMD和CMD规范(了解) 1.1传统的前端开发多个js文件的关系 yuan.js中定义了一个函数 function mianji(r){ return 3.14 * r * r } main.j ...

随机推荐

  1. MariaDB 与Mysql版本对应关系

    特定MariaDB版本的完全兼容性 就InnoDB而言,MariaDB 10.2.MariaDB 10.3和MariaDB 10.4是MySQL 5.7的有限替代.然而,在每一个新的MariaDB版本 ...

  2. 二级python考试大纲以及考试指导复习方案

    二级python考试大纲与复习指导 本人也是在备考二级py 可能理解不对的地方请指正 参考网络,侵权删除 考纲解读→ 一.考试介绍 1.1考试人群 ​ 全国计算机等级考试(python语言程序设计(二 ...

  3. Centos8 下部署 ASP.net Core 程序

    1.安装需要的SDK包,如果程序包含3.1版本,需要安装3.1的SDK. sudo dnf install dotnet-sdk-5.0dotnet --versiondotnet --list-ru ...

  4. mysql更改my.ini配置文件以后mysql服务无法启动

    最近在调试mysql时,更改了mysql的端口以后发现,mysql怎么改都启动不了,从其它机器重新复制一个my.ini文件就可以启动,这是由于一般用记事本打开配置文件同时更改的ini的格式,我们需要重 ...

  5. 自动化运维之SaltStack初探

    1.1.基础环境 linux-node1(master服务端) 192.168.31.46 CentOS 6.6 X86_64 linux-node2(minion客户端) 192.168.31.47 ...

  6. S2-045(RCE远程代码执行)

    环境搭建: https://blog.csdn.net/qq_36374896/article/details/84145020 漏洞复现 进入漏洞环境 (048和045一样) cd vulhub-m ...

  7. C# WinForm 设置按纽为透明,使用背景色

    今天开发登陆界面时,遇到一个窗体控制设置问题: 1.将按纽设置为透明: 2.并且使用背景图片的颜色: 3.并且需要当点击这个按纽时,仍然显示背景图片颜色: 4.去掉按纽边框显示线: 需要的效果如下: ...

  8. tea加密算法及其变种的研究

    tea 介绍 "TEA" 的全称为"Tiny Encryption Algorithm" 是1994年由英国剑桥大学的David j.wheeler发明的. T ...

  9. BUU findkey

    定位关键函数 跟入flag找到问题位置 两行一样的代码,nop掉第二行,按p生成函数 代码审计 int __userpurge sub_4018C4@<eax>(int a1@<eb ...

  10. Bean实例化方式

    https://blog.csdn.net/diaosinixiheixiu/article/details/78919395 https://www.cnblogs.com/deng-cc/p/89 ...