一、Promise 自定义封装
## 1. 初始结构搭建
```html
<script>
let p = new Promise((resolve, reject) => {
resolve('OK')
})
p.then(value => {
console.log(value);
}, reason => {
console.warn(reason);
})
</script>
function Promise(executor) {
}
Promise.prototype.then = function (onResolved, onRejected) {
}
2. resolve 与 reject 结构搭建
function Promise(executor) {
function resolve(data) {
}
function reject(data) {
}
executor(resolve, reject)
}
Promise.prototype.then = function (onResolved, onRejected) {
}
3. resolve 与 reject 代码实现
<script>
let p = new Promise((resolve, reject) => {
resolve('OK')
})
console.log(p);
p.then(value => {
console.log(value);
}, reason => {
console.warn(reason);
})
</script>
function Promise(executor) {
this.PromiseState = 'pending'
this.PromiseResult = null
const self = this
function resolve(data) {
self.PromiseState = 'fulfilled'
self.PromiseResult = data
}
function reject(data) {
self.PromiseState = 'rejected'
self.PromiseResult = data
}
executor(resolve, reject)
}
Promise.prototype.then = function (onResolved, onRejected) {
}
4. throw 抛出异常改变状态
<script>
let p = new Promise((resolve, reject) => {
throw new Error('error')
})
console.log(p);
p.then(value => {
console.log(value);
}, reason => {
console.warn(reason);
})
</script>
function Promise(executor) {
this.PromiseState = 'pending'
this.PromiseResult = null
const self = this
function resolve(data) {
self.PromiseState = 'fulfilled'
self.PromiseResult = data
}
function reject(data) {
self.PromiseState = 'rejected'
self.PromiseResult = data
}
try {
executor(resolve, reject)
} catch (error) {
reject(error)
}
}
Promise.prototype.then = function (onResolved, onRejected) {
}
5. Promise 对象只能修改一次
<script>
let p = new Promise((resolve, reject) => {
resolve('OK')
reject('error')
})
console.log(p);
p.then(value => {
console.log(value);
}, reason => {
console.warn(reason);
})
</script>
function Promise(executor) {
this.PromiseState = 'pending'
this.PromiseResult = null
const self = this
function resolve(data)