家长小本APP
人工智能亲子生活社区!
下载家长小本APP
Promise
1472581

const RESOLVED = 'RESOLVED'

const REJECTED = 'REJECTED'

const PENDING = 'PENDING'

const resolvePromise = (promise2, x, resolve, reject) => {

if (promise2 === x) {

return reject(new TypeError('循环引用报错'))

}

if (x !== null && (typeof x === 'object' || typeof x === 'function')) {

let called;

try {

let then = x.then

if (typeof then === 'function') {

then.call(x, y => {

if (called) return

called = true

resolvePromise(promise2, y, resolve, reject)

}, e => {

if (called) return

called = true

reject(e)

})

} else {

resolve(x)

}

} catch (e) {

if (called) return

called = true

reject(e)

}

} else {

resolve(x)

}

}

class Promise {

constructor(executor) {

this.status = PENDING

this.value = undefined

this.reason = undefined

this.onfulfilledCallbacks = []

this.onrejectedCallbacks = []

let resolve = (value) => {

if (value instanceof Promise) {

return value.then(resolve, reject)

}

if (this.status === PENDING) {

this.value = value

this.status = RESOLVED

this.onfulfilledCallbacks.forEach(fn => fn())

}

}

let reject = (reason) => {

if (this.status === PENDING) {

this.reason = reason

this.status = REJECTED

this.onrejectedCallbacks.forEach(fn => fn())

}

}

try {

executor(resolve, reject)

} catch (e) {

reject(e)

}

}

then(onfulfilled, onrejected) {

onfulfilled = typeof onfulfilled === 'function' ? onfulfilled : v => v;

onrejected = typeof onrejected === 'function' ? onrejected : err => {

throw err

};

let promise2 = new Promise((resolve, reject) => {

if (this.status === RESOLVED) {

setTimeout(() => {

try {

let x = onfulfilled(this.value)

resolvePromise(promise2, x, resolve, reject)

} catch (e) {

reject(e)

}

})

}

if (this.status === REJECTED) {

setTimeout(() => {

try {

let x = onrejected(this.reason)

resolvePromise(promise2, x, resolve, reject)

} catch (e) {

reject(e)

}

})

}

if (this.status === PENDING) {

this.onfulfilledCallbacks.push(() => {

setTimeout(() => {

try {

let x = onfulfilled(this.value)

resolvePromise(promise2, x, resolve, reject)

} catch (e) {

reject(e)

}

})

})

this.onrejectedCallbacks.push(() => {

setTimeout(() => {

try {

let x = onrejected(this.reason)

resolvePromise(promise2, x, resolve, reject)

} catch (e) {

reject(e)

}

})

})

}

})

return promise2

}

catch (onrejected) {

return this.then(null, onrejected)

}

finally(cb) {

return this.then(

(data) => {

return Promise.resolve(cb()).then(() => data)

}, (err) => {

return Promise.resolve(cb()).then(() => { throw err })

})

}

static resolve(value) {

return new Promise((resolve, reject) => {

resolve(value)

})

}

static reject(reason) {

return new Promise((resolve, reject) => {

reject(reason)

})

}

static all(promises) {

return new Promise((resolve, reject) => {

let result = []

let times = 0

const processSuccess = (index, val) => {

result[index] = val

if (++times === promises.length) {

resolve(result)

}

}

for (let i = 0; i < promises.length; i++) {

let p = promises[i];

if (p && typeof p.then === 'function') {

p.then(data => {

processSuccess(i, data)

}, reject)

} else {

processSuccess(i, p)

}

}

})

}

static race(promises) {

return new Promise((resolve, reject) => {

for (let i = 0; i < promises.length; i++) {

let p = promises[i];

if (p && typeof p.then === 'function') {

p.then(data => {

resolve(data)

}, reject)

} else {

resolve(p)

}

}

})

}

}

Promise.defer = Promise.deferred = function () {

let dfd = {}

dfd.promise = new Promise((resolve, reject) => {

dfd.resolve = resolve;

dfd.reject = reject

})

return dfd;

}

module.exports = Promise

转载请注明来源:https://jiazhangxiaoben.com/nw/page/article/seocontent.html?id=254886
推荐日记
《6.2》
《记录六一》
《天天像打仗一样——马不停蹄》
《六一儿童节》
《六一》
《快乐的六一儿童节》
《六一儿童节快乐》
《202162吃鸡爪》
《第54篇》
《亲子日记第54日》
《亲子成长日记(529)-6.1》
《记录日记的第三天》
《6月2日晴第47篇》
《2021.06.02》
《(第187篇)开心的六一》
《亲子日记548 2021.5.31星期一晴转中雨》
《273篇 6月1日》
《儿童节》
《电擎雷轰雨覆盆》
《随记》
《一年级济南文化课》
《Promise》
《六一儿童节了快乐》
《亲子日记第193篇~一年级十班郭美萱201夜》
《亲子日记》
《快乐的六一儿童节》
《“小尾巴”日记》
《六一儿童节》
《亲子日记第284篇》
《郭雨彤亲子日记第48篇》
下载家长小本APP