状态的变化不可逆Promise
它是一个ES6提出一个新语法,用来优化异步代码的写法。
promise:承诺。
- 生活中.它是用来表述 对将来要发生的事情的肯定。
- 在ES6中,它是新增的构造器(Array, Object, Promise),用来优化实现异步操作。在没有它之前,javascript中的异步处理,大多是利用回调函数来实现的。典型的几种如下:
- (1)setTimeout
- (2)ajax 现在有了promise,就可以对这些异步操作进行改写了
经典格式:
let p1 = new Promise((resolve, reject) => {
// resolve和reject是Promise内提供的2个函数, 用于回调返回结果到外面
resolve(成功结果) // 触发.then()小括号里函数体执行
reject(失败结果) // 触发.catch()小括号里函数体执行
})
p1.then((成功结果变量名) => {
}).catch((失败结果变量名) => {
}).finally(()=>{
// 一定会执行的代码
})
- resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”,触发.then的执行
- reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”,触发.catch的执行
promise相关语法:
// 语法:
/*
let Promise对象变量名 = new Promise((resolve, reject) => {
// resolve和reject是Promise内提供的2个函数, 用于回调返回结果到外面
resolve(成功结果) // 触发.then()小括号里函数体执行
reject(失败结果) // 触发.catch()小括号里函数体执行
})
Promise对象变量名.then((成功结果变量名) => {
}).catch((失败结果变量名) => {
})
*/
let p = new Promise((resolve, reject) => {
// resolve和reject是Promise内提供的2个函数, 用于回调返回结果到外面
// resolve('成功了')
reject('失败了')
})
p.then(res => {
console.log(res)
}).catch(err => {
console.error(err)
})
图示:
Promise_三种状态和值
三种状态
(pending: 准备; resolved(或者fulfilled) 成功; rejected: 失败
准备:new实例化后, Promise对象(pending准备状态)
成功:当Promise内代码执行了resolve, 会导致所在的Promise对象 变成 fulfilled成功状态
失败:当Promise内代码执行了reject, 会导致所在的Promise对象 变成 rejected失败状态
状态的变化不可逆
promise值:
resolve(值),这个值会自动传递给then
reject(值),这个值会自动传递给catch
示例代码:
// 1. 创建Promise对象并返回此对象在原地, 并立刻执行函数内代码, 交给浏览器去做倒计时了(异步, 不会阻塞主线程代码往下走, 所以继续走2)
let p = new Promise((resolve, reject) => {
setTimeout(() => {
// 3. 等2秒后, resolve触发, 影响p对象状态
resolve('成功结果') // resolve => fulfilled状态 => .then
// reject('失败结果') // reject => rejected状态 => .catch
}, 2000)
})
// 2. 立刻给p对象添加.then函数并传入函数体等待被调用接收成功结果(此是.then()小括号里函数体不会执行)
p.then(res => {
console.log(res); // 2秒后返回'成功结果'
}).catch(err => {
console.error(err)
})
Promise对象的状态如何切换?
刚创建会立刻执行new Promise函数内代码, 此时为pending准备状态
当Promise对象内异步代码有结果触发resolve, 会导致Promise对象状态为fulfilled兑现成功状态
当Promise对象内异步代码有结果触发reject, 会导致Promise对象状态为rejected失败状态, 拒绝兑现承诺