1、promise对象的介绍
1.1 什么是Promise对象:
Js中进行异步编程的新的解决方案(传统的解决方案——回调函数和事件),
用于表示一个异步操作的最终完成 (或失败), 及其结果值.。
语法上:promise是一个构造函数
简单来说,promise对象用来封装一个异步操作并可以获取其结果 可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
Promise是一个代理对象,它代理的是一个值,这个值我们可以称为Promise对象的状态(status)。这个status对Promise非常重要
1.2 promise三种状态:
pending(进行中,初始状态,既不是成功,也不是失败状态)
fulfilled (已完成)
rejected (已失败)
一个promise的状态只可能 从 “等待”转到“成功“态 或者 “失败“态,不能逆向转换,
同时“成功“态和“失败“态不能相互转换
promise必须实现then方法(then就是promise的核心),而且then必须返回一个promise,
同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致 then方法接受两个参数
第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,
另一个是失败时的回调,在promise由“等待”态转换到“拒绝"态时调用。
同时,then可以接受另一个promise传入,
也接受一个“类then”的对象或方法解决函数的回调嵌套问题
1.3 promise 一些方法
Promise.prototype.then()
Promise实例具有then方法,then是定义在原型对象上的
Promise.prototype.catch()
是.then(null,rejection)的别名,用于指定发生错误时的回调函数
Promise.all() 都执行完再执行, Promise.race () 最快的那个执行完了就执行
1.4 Promise缺点
无法取消Promise,一旦新建它就会立即执行,无法中途取消 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部 当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成) 针对Promise缺点,诞生了async和await(es7中)
async是一个函数的修饰符,加上async关键词的函数会隐式地返回一个Promise 函数的返回值将作为Promise resolve的值 await后面跟的一定是一个Promise,async只能出现在async函数内 await的语义是:必须等到await后面跟的Promise有了返回值,才能继续执行await的下一行代码
2、Promise 的基本使用
示例1:
function rand(m, n) {
return Math.ceil(Math.random() * (n - m + 1)) + (m - 1)
}
const p = new Promise((resolve, reject) => {
setTimeout(() => {
const a = rand(1, 100)
if (a <= 30) {
resolve(a)
} else {
reject(a)
}
}, 1000)
})
console.log(p);
p.then((value) => {
alert("恭喜你中奖了,你的号码是"+value)
}, (reson) => {
alert("再接再厉,你的号码是:"+reson)
})
示例2(配合asycn/await的使用):
const store = new Vuex.Store({
state: {
name: '张三',
number: 0,
},
mutations: {
setNumberIsWhat(state, payload) {
state.number = payload.number;
},
},
actions: {
// 增加actions属性
setNum(content) {
// 增加setNum方法,默认第一个参数是content,其值是复制的一份store
return new Promise(resolve => {
// 我们模拟一个异步操作,1秒后修改number为888
setTimeout(() => {
content.commit('setNumberIsWhat', { number: 888 });
resolve();
}, 1000);
});
},
},
});
async mounted() {
console.log(`旧值:${this.$store.state.number}`);
await this.$store.dispatch('setNum');
console.log(`新值:${this.$store.state.number}`);
}