Promise
解决回调地狱的方案之一
把回调地狱写的优雅的方案之一
Promise 单词
承诺
这个承诺有几个状态(三个)
1. 承诺继续 => 两个人在一起过日子
2. 成功 => 最后两个人埋在一个坟里面
3. 失败 => 有一个人埋在别人的坟里
一旦状态确定, 不可变更
=> 继续 -> 成功
=> 继续 -> 失败
=> 不可能由成功转变为失败
对应在 Promise 的语法里面的时候
=> 继续 -> pending -> 正在进行时
=> 成功 -> fulfilled -> 过去完成时
=> 失败 -> rejected -> 过去完成时
Promise 是做什么的
承诺会帮你做 异步的事情
会在成功的时候给你一个成功的回调
会在失败的时候给你一个失败的回调
我们把异步的事情交给 promise 来做
=> 我们等待结果就好
=> pending 继续, 也就是正在帮你做这个异步的事情
=> fulfilled 成功, 结果
=> rejected 失败, 结果
Promise 类比在 ajax 请求里面
=> pending 就是正在请求(网络传输过程中)
=> fulfilled 就是请求成功了(网络环境允许请求, 可以连接到服务器拿到结果)
=> rejected 就是请求失败了(突然没有网了, 掉线了, 不会再有结果回来了)
Promise 的语法
在 es6 里面有一个内置的构造函数叫做 Promise
语法: let p1 = new Promise(function () { 你要做的异步的事情 })
promise 对象里面由两个方法
一个叫做 then => 就是 p1 帮你做的异步的事情成功的时候执行的
一个叫做 catch => 就是 p1 帮你做的异步的事情失败的时候执行的
// 先用定时器来模拟
var p1 = new Promise(function (resolve, reject) {
// 帮我做一件异步的事情
var xhr = new XMLHttpRequest()
xhr.open('GET', './server/a.php')
xhr.onreadystatechange = function () {
if (xhr.status === 200 && xhr.readyState === 4) {
resolve(xhr.responseText) // 实参
// 给的就是后端返回的内容
}
if (xhr.status === 404) {
reject('请求地址不对')
}
}
xhr.send()
})
// then 函数
p1.then(function (res) { // 形参
console.log('我执行了, 我表示成功')
// res 接受到的就是 resolve () 里面的实参 => 100
// res 接收到的就是 后端返回的内容
console.log(res)
})
// catch 函数
p1.catch(function () {
console.log('我执行了, 我表示失败')
})