You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
getJSON('/post/1.json').then(function(post){returngetJSON(post.commentURL);}).then(function(comments){// some code}).catch(function(error){// 处理前面三个Promise产生的错误});
一、介绍
Promise
,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码
阅读上面代码,是不是很难受,上述形成了经典的回调地狱
现在通过
Promise
的改写上面的代码瞬间感受到
promise
解决异步操作的优点:下面我们正式来认识
promise
:状态
promise
对象仅有三种状态pending
(进行中)fulfilled
(已成功)rejected
(已失败)特点
pending
变为fulfilled
和从pending
变为rejected
),就不会再变,任何时候都可以得到这个结果流程
认真阅读下图,我们能够轻松了解
promise
整个流程二、用法
Promise
对象是一个构造函数,用来生成Promise
实例Promise
构造函数接受一个函数作为参数,该函数的两个参数分别是resolve
和reject
resolve
函数的作用是,将Promise
对象的状态从“未完成”变为“成功”reject
函数的作用是,将Promise
对象的状态从“未完成”变为“失败”实例方法
Promise
构建出来的实例存在以下方法:then()
then
是实例状态发生改变时的回调函数,第一个参数是resolved
状态的回调函数,第二个参数是rejected
状态的回调函数then
方法返回的是一个新的Promise
实例,也就是promise
能链式书写的原因catch
catch()
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数Promise
对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止一般来说,使用
catch
方法代替then()
第二个参数Promise
对象抛出的错误不会传递到外层代码,即不会有任何反应浏览器运行到这一行,会打印出错误提示
ReferenceError: x is not defined
,但是不会退出进程catch()
方法之中,还能再抛出错误,通过后面catch
方法捕获到finally()
finally()
方法用于指定不管 Promise 对象最后状态如何,都会执行的操作构造函数方法
Promise
构造函数存在以下方法:all()
Promise.all()
方法用于将多个Promise
实例,包装成一个新的Promise
实例接受一个数组(迭代对象)作为参数,数组成员都应为
Promise
实例实例
p
的状态由p1
、p2
、p3
决定,分为两种:p1
、p2
、p3
的状态都变成fulfilled
,p
的状态才会变成fulfilled
,此时p1
、p2
、p3
的返回值组成一个数组,传递给p
的回调函数p1
、p2
、p3
之中有一个被rejected
,p
的状态就变成rejected
,此时第一个被reject
的实例的返回值,会传递给p
的回调函数注意,如果作为参数的
Promise
实例,自己定义了catch
方法,那么它一旦被rejected
,并不会触发Promise.all()
的catch
方法如果
p2
没有自己的catch
方法,就会调用Promise.all()
的catch
方法race()
Promise.race()
方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例只要
p1
、p2
、p3
之中有一个实例率先改变状态,p
的状态就跟着改变率先改变的 Promise 实例的返回值则传递给
p
的回调函数allSettled()
Promise.allSettled()
方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例只有等到所有这些参数实例都返回结果,不管是
fulfilled
还是rejected
,包装实例才会结束resolve()
将现有对象转为
Promise
对象参数可以分成四种情况,分别如下:
promise.resolve
将不做任何修改、原封不动地返回这个实例thenable
对象,promise.resolve
会将这个对象转为Promise
对象,然后就立即执行thenable
对象的then()
方法then()
方法的对象,或根本就不是对象,Promise.resolve()
会返回一个新的 Promise 对象,状态为resolved
resolved
状态的 Promise 对象reject()
Promise.reject(reason)
方法也会返回一个新的 Promise 实例,该实例的状态为rejected
Promise.reject()
方法的参数,会原封不动地变成后续方法的参数三、使用场景
将图片的加载写成一个
Promise
,一旦加载完成,Promise
的状态就发生变化通过链式操作,将多个渲染数据分别给个
then
,让其各司其职。或当下个异步请求依赖上个请求结果的时候,我们也能够通过链式操作友好解决问题通过
all()
实现多个请求合并在一起,汇总所有请求结果,只需设置一个loading
即可通过
race
可以设置图片请求超时参考文献
The text was updated successfully, but these errors were encountered: