手写Promise?先掌握这几个核心点

个人笔记形式的分享
复制代码

为什么要使用异步编程?

避免因为等待某个异步操作而阻塞线程执行
复制代码

Promise解决了什么问题?

解决了传统异步编程中的“回调地狱”问题,即通过Promise链式调用代替函数嵌套,将异步操作队列化
复制代码

关于创建Promise实例

Promise的实例的三种状态:pending(待定,默认状态)、resolved/fulfilled(完成)、rejected(拒绝)

创建Promise实例:
1.new Promise(executor)	//必须传递一个executor(执行器函数)作为参数,否则将抛出SyntaxError
2.Promise.resolve()	//生成一个完成状态的Promise实例
3.Promise.reject()	//生成一个拒绝状态的Promise实例,并抛出异步错误。注意:try/catch无法捕获异步错误,异步错误只能通过异步结构进行捕获

关于执行器函数:
主要作用:初始化Promise的异步行为和控制状态的转换
1.通过new创建Promise实例时,执行器函数将作为同步代码立即执行
2.调用resolve()--转换为完成状态,调用reject()--转换为拒绝状态
3.状态落定之后,无法再改变,同时会返回一个结果【完成时的内部值(value)或拒绝时的理由(reason)】

let p = new Promise((resolve, reject) => {
    return resolve(); //或reject();
})
复制代码

Promise上的方法

//以下方法,返回值都是一个新的Promise实例
1.Promise.prototype.then()
关于参数:
接收最多两个参数:onResolved处理程序和onRejected处理程序,在对应的完成状态或拒绝状态时执行,
两个处理程序参数都是可选的,但是如果传给then()任何非函数类型参数都会被忽略
关于返回值:
如果没有显示的返回值,将通过Promise.resolve()包装默认的返回值undefined
如果有显示的返回值,将通过Promise.resolve()包装这个值并返回

2.Promise.prototype.catch()
是一个语法糖,相当于Promise.prototype.then(null, onRejected),在拒绝状态时执行

3.Promise.prototype.finally()
参数是onFinally处理程序,无论是完成状态还是拒绝状态都会执行,但无法知道具体是哪一种状态
返回值,通常是父Promise实例的传递

4.Promise.all()
必须传递一个可迭代对象作为参数,否则将抛出语法错误;若可迭代对象为空,则等价于Promise.resolve()
如果包含的每个Promise实例都是完成状态,则返回完成状态的实例(其内部值是一个数组,包含每个可迭代对象的value,顺序为迭代器顺序)
只要有一个Promise实例是拒绝状态,则返回拒绝状态的实例(其理由是可迭代对象中,第一个转换为拒绝状态的reason)

5.Promise.race()
必须传递一个可迭代对象作为参数,否则将抛出语法错误
定位到第一个转换状态的Promise实例,包装其完成的内部值或拒绝的理由并返回新的Promise实例
复制代码

Promise有什么缺陷?

1.一旦新建Promise实例它就会立即执行,无法中途取消
2.一旦状态落定,无法再改变状态,同时也无法查看Promise实例的执行进度
复制代码

附加一道面试题,帮助理解Promise(答案–浏览器运行即可):

const p = () => new Promise((res, rej) => {
    console.log(3);
    let f = new Promise((res, rej) => {
        console.log(7);
        setTimeout(() => {
            console.log(5);
            res(6);
        }, 0);
        res(1);
    })
    res(2);
    f.then(arg => {
        console.log(arg);
    });
});

p().then(arg => {
    console.log(arg);
});

console.log(4);
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享