简答 : Promise 是异步编程的一种解决方案,它是一个对象,可以获取异步操作的消息,他的出现大大改善了异步编程的困境,避免了回调地狱,它比传统的解决方案回调函数和事件更合理和更强大。但其实Promise自身其实并没有完全解决回调地狱, 它只是让回调地狱变得可控, 真正解决回调地狱的是es7出来的async , await .
一 : Promise
Promise是一个构造函数,通过new关键字实例化对象.译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大
- 链式操作减低了编码难度
- 代码可读性明显增强
状态
promise
对象仅有三种状态
pending
(进行中)fulfilled
(已成功)rejected
(已失败)
特点
- 对象的状态不受外界影响,只有异步操作的结果,可以决定当前是哪一种状态
- 一旦状态改变(从
pending
变为fulfilled
和从pending
变为rejected
),就不会再变,任何时候都可以得到这个结果
二 : 用法
Promise
对象是一个构造函数,用来生成Promise
实例
const promise = new Promise(function (resolve, reject) {})
1
Promise
构造函数接受一个函数作为参数,该函数的两个参数分别是resolve
和reject
resolve
函数的作用是,将Promise
对象的状态从“未完成”变为“成功”reject
函数的作用是,将Promise
对象的状态从“未完成”变为“失败”
实例方法
Promise
构建出来的实例存在以下方法:
- then()
- catch()
- finally()
then()
then
是实例状态发生改变时的回调函数,第一个参数是resolved
状态的回调函数,第二个参数是rejected
状态的回调函数
then
方法返回的是一个新的Promise
实例,也就是promise
能链式书写的原因
getJSON('/posts.json')
.then(function (json) {
return json.post
})
.then(function (post) {
// ...
})
catch
catch()
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数
getJSON('/posts.json')
.then(function (posts) {
// ...
})
.catch(function (error) {
// 处理 getJSON 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error)
})
Promise
对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止
getJSON('/post/1.json')
.then(function (post) {
return getJSON(post.commentURL)
})
.then(function (comments) {
// some code
})
.catch(function (error) {
// 处理前面三个Promise产生的错误
})
一般来说,使用catch
方法代替then()
第二个参数
Promise
对象抛出的错误不会传递到外层代码,即不会有任何反应
const someAsyncThing = function () {
return new Promise(function (resolve, reject) {
// 下面一行会报错,因为x没有声明
resolve(x + 2)
})
}
浏览器运行到这一行,会打印出错误提示ReferenceError: x is not defined
,但是不会退出进程
catch()
方法之中,还能再抛出错误,通过后面catch
方法捕获到
finally()
finally()
方法用于指定不管 Promise 对象最后状态如何,都会执行的操作
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
构造函数方法
Promise
构造函数存在以下方法:
- all()
- race()
- allSettled()
- resolve()
- reject()
- try()