coderliush / Blog

博客
0 stars 0 forks source link

JavaScript 之 Promise #11

Open coderliush opened 3 years ago

coderliush commented 3 years ago
const PENDING = 'pending'
const RESOLVED = 'resolved'
const REJECTED = 'reject'
function Promise(executor) {
    var self = this
    self = PENDING
    self.resolvedCallbacks = []
    self.rejectedCallbacks = []

    function resolve(value) {
        if (self.status === PENDING) {
            self.status = RESOLVED
            self.value = value
            for(var i = 0; i < self.rejectedCallbacks.length; i++) {
                // self.rejectedCallbacks[i] 是个函数。函数调用的时候指向 点 前面的。这里 this 指向点前面的self
                // promise 规范 onFulfilled must be called as funtions( with no this value) 严格模式下是 undefined,非严格模式下是 window
                // self.rejectedCallbacks[i](value)   
                var f 
                f = self.rejectedCallbacks[i]
                f(value)
            }
        }
    }

    function reject(reson) {
        if (self.status === PENDING) {
            self.status = REJECTED
            self.value = value
            for(var i = 0; i < self.rejectedCallbacks.length; i++) {
                // self.rejectedCallbacks[i] 是个函数。函数调用的时候指向 点 前面的。这里 this 指向点前面的self
                // promise 规范 onFulfilled must be called as funtions( with no this value) 严格模式下是 undefined,非严格模式下是 window
                // self.rejectedCallbacks[i](value)   
                var f 
                f = self.rejectedCallbacks[i]
                f(value)
            }
        }
    }

    try {
        executor(resolve, reject)
    } catch(e) {
        reject(e)
    }
}

Promise.prototype.then = function(onResolved, onRejected) {
    var self = this

    // then 的两个参数必须是函数,不然忽略
    if (typeof onResolved !== 'function') {
        onResolved = function() {}
    }
    if (typeof onRejected !== 'function') {
        onRejected = function() {}
    }

    var promise2

    if (self.status === RESOLVED) {
        promise2 = new Promise(function(resolve, reject) {
            try {
                // resolve(value) 后 执行 then 成功的回调,参数为 value 
                var x = onResolved(self.value)
                // 如果有多个 then,回调函数执行的结果传入下一个 promise 
                // 如果回调函数 return 一个 promise,等待 promise 执行? 否则将函数 return 结果 x 传入下一个 then
                if (x instanceof Promise) {
                    x.then(resolve, reject)
                } else {
                    resolve(x)
                } 
            } catch(e) {
                reject(e)
            }
        })
    }
}