【前端进阶】手写PromiseA+
简易版(面试可用)升级版
简易版(面试可用)
(function () {
function Promise(executor
) {
if (typeof executor
!== "function") throw new TypeError(Object
.prototype
.toString
.call(executor
) + 'is not a function');
var self
= this;
self
.PromiseState
= "pending";
self
.PromiseResult
= undefined
;
self
.fulfilledCallback
= [];
self
.rejectedCallback
= []
var run = function run(state
, value
) {
if (self
.PromiseState
!== "pending") return;
self
.PromiseState
= state
;
self
.PromiseResult
= value
;
setTimeout(function () {
var arr
= self
.PromiseState
=== "fulfilled" ? self
.fulfilledCallback
: self
.rejectedCallback
;
for (var i
= 0; i
< arr
.length
; i
++) {
var func
= arr
[i
];
if (typeof func
=== "function") {
func(self
.PromiseResult
)
}
}
})
}
var resolve = function resolve(value
) {
run("fulfilled", value
)
}
var reject = function reject(value
) {
run("rejected", value
)
}
try {
executor(resolve
, reject
)
} catch (err) {
reject(err
)
}
}
Promise
.prototype
= {
customize
: true,
consturctor
: Promise
,
then
: function then(onfulfilled
, onrejected
) {
var self
= this;
switch (self
.PromiseState
) {
case "fulfilled":
setTimeout(function () {
onfulfilled(self
.PromiseResult
)
})
break;
case "rejected":
setTimeout(function () {
onrejected(self
.PromiseResult
)
})
break;
default:
self
.fulfilledCallback
.push(onfulfilled
)
self
.rejectedCallback
.push(onrejected
)
break;
}
},
catch: function (params
) {
}
}
window
.Promise
= Promise
;
})()
升级版
完善then的链式调用promise的方法扩展
(function () {
function Promise(executor
) {
if (typeof executor
!== "function") throw new TypeError(Object
.prototype
.toString
.call(executor
) + 'is not a function');
var self
= this;
self
.PromiseState
= "pending";
self
.PromiseResult
= undefined
;
self
.fulfilledCallback
= [];
self
.rejectedCallback
= []
var run = function run(state
, value
) {
if (self
.PromiseState
!== "pending") return;
self
.PromiseState
= state
;
self
.PromiseResult
= value
;
setTimeout(function () {
var arr
= self
.PromiseState
=== "fulfilled" ? self
.fulfilledCallback
: self
.rejectedCallback
;
for (var i
= 0; i
< arr
.length
; i
++) {
var func
= arr
[i
];
if (typeof func
=== "function") {
arr
[i
](self
.PromiseResult
)
}
}
})
}
var resolve = function resolve(value
) {
run("fulfilled", value
)
}
var reject = function reject(value
) {
run("rejected", value
)
}
try {
executor(resolve
, reject
)
} catch (err) {
reject(err
)
}
}
function resolvePromise(promise
, x
, resolve
, reject
) {
if (x
=== promise
) {
throw TypeError('传入的值不能与当前promise对象相同')
}
if (x
!= null && typeof x
=== "function" || typeof x
=== "object") {
try {
var then
= x
.then
;
if (typeof x
.then
=== "function") {
then
.call(x
, function (value
) {
resolve(value
)
}, function (reason
) {
reject(reason
)
})
} else {
resolve(x
)
}
} catch (err) {
reject(err
)
}
} else {
resolve(x
)
}
}
Promise
.prototype
= {
customize
: true,
consturctor
: Promise
,
then
: function then(onfulfilled
, onrejected
) {
if (typeof onfulfilled
!== "function") {
onfulfilled = function onfulfilled(value
) {
return value
}
}
if (typeof onrejected
!== "function") {
onrejected = function onrejected(reason
) {
throw reason
}
}
var self
= this;
var promise
= new Promise(function (resolve
, reject
) {
switch (self
.PromiseState
) {
case "fulfilled":
setTimeout(function () {
try {
var x
= onfulfilled(self
.PromiseResult
);
resolvePromise(promise
, x
, resolve
, reject
)
} catch (err) {
reject(err
)
}
})
break;
case "rejected":
setTimeout(function () {
try {
var x
= onrejected(self
.PromiseResult
);
resolvePromise(promise
, x
, resolve
, reject
)
} catch (err) {
reject(err
)
}
})
break;
default:
self
.fulfilledCallback
.push(function (PromiseResult
) {
try {
var x
= onfulfilled(PromiseResult
);
resolvePromise(promise
, x
, resolve
, reject
)
} catch (err) {
reject(err
)
}
})
self
.rejectedCallback
.push(function (PromiseResult
) {
try {
var x
= onrejected(PromiseResult
);
resolvePromise(promise
, x
, resolve
, reject
)
} catch (err) {
reject(err
)
}
})
break;
}
})
return promise
},
catch: function (onrejected
) {
var self
= this;
return self
.then(null, onrejected
)
}
}
Promise
.resolve = function resolve(value
) {
return new Promise(function (resolve
) {
resolve(value
)
})
}
Promise
.reject = function reject(reason
) {
return new Promise(function (_
, reject
) {
reject(reason
)
})
}
window
.Promise
= Promise
;
})()
转载请注明原文地址: https://lol.8miu.com/read-23888.html