# promise是什么

  • promise是异步编程的一种解决方案:
    从语法上讲,promise是一个对象,从它可以获取异步操作的消息;
    从本意上讲,它是承诺,承诺过一段时间会给你一个结果。

# promise的优缺点

# 优点:

  • 指定回调函数的方式更灵活:
    旧的方法:必须在启动异步任务之前指定回调
    promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数

  • 支持链式调用:
    将异步操作以同步操作的流程表达出来,可以解决回调地狱问题

回调地狱:函数作为参数层层嵌套

最好的解决办法是async/await

# 缺点:

  • 无法取消promise
    一旦新建它就会立即执行,无法中途取消

  • 必须设置回调函数
    如果不设置回调函数,promise内部抛出的错误,不会反映到外部

  • pending下无法得知具体状态
    当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

# 手写实现promise:

简易版

function myPromise(constructor) {
    let self = this;
    self.status = "pending"     // 定义状态改变前的初始状态
    self.value = undefined      // 定义状态为resolved的时候的状态
    self.reason = undefined     // 定义状态为rejected的时候的状态

    function resolve(value) {
        // 两个==="pending",保证了状态是改变是不可逆的
        if(self.status === "pending") {
            self.value = value
            self.status = "resolved"
        }
    }

    function reject(reason) {
        // 两个==="pending",保证了状态是改变是不可逆的
        if(self.status == "pending") {
            self.reason = reason
            self.status = "rejected"
        }
    }
    
    // 捕获构造异常
    try{
        constructor(resolve, reject)
    }catch(e){
        reject(e)
    }
}

myPromise.prototype.then = function(onFullfilled, onRejected) {
    let self = this;
    switch(self.status) {
        case "resolved":
            onFullfilled(self.value)
            break;
        case "rejected":
            onRejected(self.reason)
            break;
        default:
    }
}

测试:

var  p = new myPromise(function(resolve, reject) {
    // resolve("ohohoho")
    reject('because')
})

p.then(function(x) {
    console.log(x);
},function(x) {
    console.log(x);
})