看看大佬们的文章吧!
好文推荐!!!
Promises/A+规范
大佬详细解剖
大佬手写promise
给大佬们的文章点个赞吧!!!
源码
function Promise(executor) {
//promise的实例
var self = this
// 当前的状态
self.status = 'pending'
// 收集回调的方法,到数组中
self.onResolvedCallback = []
self.onRejectedCallback = []
// 1内部定义resolve和reject方法,
// 2调用即改变状态
// 3传进来的value是传递给then中回调的函数,当做参数
function resolve(value) {
// resovle传进来一个value
// 如果resolve传递进来的参数是一个Promise对象
if (value instanceof Promise) {
return value.then(resolve, reject)
}
// setTimeOut的作用是,把任务放置在宏观任务的队尾
// 避免,执行then中的回调的时候,方法还没有定义,还未被push进数组中
// setTimeOut(fn,0),也是为了把任务放置宏观任务队列的队尾
setTimeout(function() {
// 异步执行所有的回调函数
if (self.status === 'pending') {
self.status = 'resolved'
// 把参数传递给self.data,这样就可以给下面的then回调进行使用
self.data = value
// 执行被收集的方法,且只执行下一个then中的方法
// 因为在then中会返回一个新的Promise对象
for (var i = 0; i < self.onResolvedCallback.length; i++) {
self.onResolvedCallback[i](value)
}
}
})
}
function reject(reason) {
setTimeout(function() {
// 异步执行所有的回调函数
if (self.status === 'pending') {
self.status