简易版的Promise
const PENDING = 'PENDING'
const REJECT = 'REJECT'
const FULFIllED = 'FULFIllED'
class Promise {
constructor(executor) {
this.state = PENDING
this.value = null
this.reason = null
const resolve = (value) => {
if (this.state === PENDING) {
this.value = value
this.state = FULFIllED
}
}
const reject = (reason) => {
if (this.state === PENDING) {
this.reason = reason
this.state = REJECT
}
}
executor(resolve, reject)
}
then(onResolve, onREject) {
if (this.state === FULFIllED) {
onResolve(this.value)
}
if (this.state === REJECT) {
onREject(this.reason)
}
}
}
Promise.all
let fs = require('fs')
const readFile = (path) => {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (err, data) => {
if (err) reject(err)
resolve(data)
})
})
}
Promise.MyAll = (ps) => {
return new Promise((resolve, reject) => {
let resArr = []
let times = 0
const getRes = (i, val) => {
resArr[i] = val
times++
if (times === ps.length) {
resolve(resArr)
}
}
for (let i = 0; i < ps.length; i++) {
const val = ps[i]
if (typeof val.then === 'function') {
val.then((val) => getRes(i, val), reject)
} else {
getRes(i, val)
}
}
})
}
Promise.MyAll([false, readFile('./a.txt'), readFile('./b.txt'), 1, 2, 0]).then(
(res) => {
console.log(res)
//[ false, 'aa', 'bb', 1, 2, 0 ]
}
)
// promse.race , 只看第一个结果,不论是成功还是失败
Promise.MyRace = (arr) => {
return new Promise((resolve, reject) => {
arr.forEach((item, index) => {
Promise.resolve(item).then(
(value) => {
resolve(value)
},
(reason) => {
reject(reason)
}
)
})
})
}
发布订阅
const fs = require('fs')
const after = (times, cb) => {
let obj = {}
return (key, value) => {
--times
obj[key] = value
if (times === 0) {
cb(obj)
}
}
}
const out = after(2, (obj) => {
console.log('obj', obj)
})
fs.readFile('./a.txt', 'utf-8', (err, data) => {
out('name', data)
})
fs.readFile('./b.txt', 'utf-8', (err, data) => {
out('age', data)
})