# 前言
Promise 是 node.js 在优化开发者在异步编程问题的一个阶段性方案,在这个方案出现之前还有 callback,sub/pub,generator 等,而 Promise + async await 语法糖的结合显得更加优秀,为了正确的使用 Promise,了解它的设计规范和源码实现就显得尤为重要,站在巨人的肩膀上看代码,了解设计的巧妙。
关于 Promise 的设计规范,可以参考 [[译]Promise/A+ 规范](https://zhuanlan.zhihu.com/p/143204897),通读文章内容,我简要概括以下几点内容:
- Promise 有三个状态,状态变化后不可逆
1. pending
2. fulfilled
3. rejected
- 必须提供一个 then 方法来访问最终的值或者报错原因
1. 接收两个参数 onFulFilled,onRejected,都是可选的,如果不是函数,则被忽略
2. onFulFilled 是一个函数,则 promise 的返回值将作为第一个参数传入,它一定不会在 fulfilled 状态前触发,它一定不会被触发多次
3. onRejected 是一个函数,则 promise 报错原因将作为第一个参数传入,它一定不会在 rejected 状态前触发,它一定不会被触发多次
4. 在代码执行之前,两个函数都不会被触发
5. onFulfilled和onRejected一定被作为函数调用(没有this值)
6. then 必须返回 一个promise
7. 同一个promise上的then可能被调用多次
了解 Promise 的设计规范后,我们还需要再了解 Promise 的使用方法,其中包含一些静态方法
- all 传入参数为一个 Promise 数组,当所有 promise 的状态都为 fulfilled 或者 rejected 的时候返回一个包含所有结果的数组
- race 传入参数为一个 Promise 数组,当任意一个 promise 返回结果或者异常报错的时候则停止继续执行,返回执行结果或者异常报错
```js
new Promise((resolve,reject) => {
// 成功则执行 resolve
// 失败则执行 reject
}).then(res => {
// resolve 对于触发执行
}, err => {
// reject 对应触发执行
}).catch(err => {
// 异常在这里触发
})
Promise.resolve();
Promise.reject();
Promise.all([promise1, promise2, ...]).then();
Promise.race([promise1, promise2, ...]).then();
```
通过以上分析,我们可以简要的得出下面基础结构
```js
const PENDING = 'PENDING';
const FULFILLED = 'FULFILLED';
const REJECTED = 'REJECTED';
class PromiseDemo {
constructor(execution){
this.status = PENDING
thi.resolve = (value) => {
this.value = value;
this.status = FULFILLED;
};
this.reject = (reason) => {
this.reason = reason;
this.status = REJECTED;
};
try {
execution(this.resolve,this.reject);
} catch (err){
this.reject(err);
}
}
then(onFulFiled,onRejected) {
if(this.status === FULFILLED){
if(typeof onFulFiled ==='function') {
onFulFiled(this.value);
}
} else if(this.status ===REJECTED) {
if(typeof onRejected ==='function') {
onRejected(this.reason);
}
}
}
catch(onRejected) {
if(this.status ===REJECTED) {
if(typeof onRejected ==='function') {
onRejected(this.reason);
}
}
}
static all() {}
static resolve() {}
static reject() {}
static race() {}
}
```
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
常遇见的大前端面试题内容,包括但不限于:react,vue,html,node,数据库等.zip (72个子文件)
frontend-interview-master
简答题
阿里巴巴
01
03.js 239B
题目.md 1KB
02.js 155B
汇总.md 1KB
字节跳动
01
题目.md 969B
.github
workflows
main.yml 392B
leetCode
q32最长有效括号.js 747B
q122买卖股票的最佳时机
demo2.js 961B
demo1.js 880B
q322零钱兑换.js 864B
q86分隔链表.js 1KB
q205同构字符串.js 1KB
q146LRU缓存
练习版本.js 3KB
readme.md 2KB
index.js 3KB
q94二叉树中序遍历
readme.md 297B
index.js 598B
q1两数之和.js 819B
q62不同路径.js 970B
q104二叉树的最大深度.js 921B
q17电话号码的字母组合.js 909B
q746使用最小花费爬楼梯.js 1KB
q912排序数组
冒泡
练习版本.js 464B
readme.md 387B
index.js 423B
q64最小路径和.js 1KB
q144二叉树前序遍历
练习版本.js 636B
readme.md 898B
index.js 617B
q21合并两个有序链表
readme.md 720B
index.js 861B
q33搜索旋转排序数组.js 2KB
q820单词的压缩编码
set解法.js 1KB
字典树.js 2KB
q72编辑距离.js 2KB
q242有效的字母异位词.js 2KB
q455分发饼干.js 1KB
q53最大子序和.js 827B
q145二叉树后序遍历
练习版本.js 709B
readme.md 943B
index.js 636B
q5最长回文子串
暴力解法.js 996B
动态规划.js 1KB
readme.md 3KB
基础数据结构
binaryTree.js 260B
剑指offer
18删除链表的节点.js 609B
package.json 497B
ss.md 0B
js源码实现
eventEmit源码实现
练习版本.js 0B
readme.md 991B
index.js 612B
instanceof.js 538B
深度拷贝.js 465B
函数柯里化.js 594B
promise源码实现
练习版本.js 2KB
readme.md 3KB
index.js 3KB
package-lock.json 169KB
.eslintrc.json 301B
test
leetCode
q94二叉树中序遍历.test.js 566B
q144二叉树前序遍历.test.js 1KB
q912排序数组.test.js 510B
q146LRU缓存.test.js 775B
q21合并两个有序链表.test.js 681B
q145二叉树后序遍历.test.js 583B
js源码实现
promise.test.js 1KB
eventEmit.test.js 589B
.gitignore 2KB
资料
.DS_Store 6KB
二叉树后序遍历.png 12KB
二叉树.png 162KB
.eslintignore 4B
共 72 条
- 1
资源评论
天天501
- 粉丝: 596
- 资源: 4666
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功