个人笔记形式的分享
复制代码
为什么要使用异步编程?
避免因为等待某个异步操作而阻塞线程执行
复制代码
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