全部代码
function Promise_c(func) {
this._then = []
this._catch = function (err) {
throw err
}
func(this.resolve.bind(this), this.reject.bind(this))
return this
}
Promise_c.prototype.resolve = function (res) {
if (this._then.length) {
var func = this._then.shift()
var next = func(res)
if (next instanceof Promise_c) {
next._then = [].concat(next._then, this._then)
} else {
this.resolve(next)
}
}
}
Promise_c.prototype.reject = function (err) {
this._catch && this._catch(err)
}
Promise_c.prototype.then = function (func) {
this._then.push(func)
return this
}
Promise_c.prototype.catch = function (func) {
this._catch = func
return this
}
if (next instanceof Promise_c) {
next._then = [].concat(next._then, this._then)
}
这行代码是核心, 如果上一个 then 返回的是 Primise 实例
就讲 当前Promise下所有未执行的 then 函数 全部移交给 next 的 Promise 实例
这时当前 Promise的任务已经完成
new Promise_c(function (resolve, reject) {
setTimeout(function () {
resolve('hello :1')
}, 2000)
}).then(function (res) {
console.log(res, 1)
// hello :1 1
return new Promise_c(function (resolve, reject) {
setTimeout(function () {
resolve(res + ':' + 2)
}, 2000)
})
}).then(function (res) {
console.log(res, 2)
// hello :1:2 2
})
new Promise_c(function (resolve, reject) {
setTimeout(function () {
resolve('hello :1')
}, 2000)
}).then(function (res) {
console.log(res, 1)
// hello :1 1
return new Promise_c(function (resolve, reject) {
setTimeout(function () {
resolve(res + ':' + 2)
}, 2000)
}).then(function (res) {
console.log(res, 2)
// hello :1:2 2
})
})
也就是说这两种调用的形式,最后被执行的结果是相同的,而且如果使用第一种写法(如果业务逻辑是如此)
最后执行的时候回被转化成第二种形式
网友评论