Javascript执行环境是单线程的,也就是说JS环境中负责解释和执行的线程只有一个,一次只能完成一项任务,这个任务执行完后才能执行下一个,因此Javascript中存在大量的异步操作和回调函数。
Promise函数是异步编程的一个解决方案,相对传统的解决方案,他更合理和强大。Promise的本意是“承诺”、“许诺”的意思。承诺在未来会执行某个操作的函数,就是Promise函数。其基本结构如下:
var promise = new Promise(function(resove, reject){
// ...你的代码
if (/*异步成功*/){
resove(value);
} else{
reject(error);
}
});
Promise的状态
Promise对象的状态有3个,分别是pending(进行中)、fulfilled(已完成)、rejected(已失败)。Promise对象一旦进入了某一个状态,就不会再转成其他状态了(主要是后面两种状态,fulfilled和rejected)。如一旦调用了resolve函数,就是fulfilled的状态,就不会再调用reject函数了。
pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。
fulfilled:满足状态,当我们回调了resolve函数时,就处于该状态。
rejected:拒绝状态,当我们回调了reject函数时,就处于该状态。
let p = new Promise((resolve, reject) => {
let a1 = '成功的参数';
let a2 = '失败的参数';
var time = setTimeout(() => {
console.log('start');
resolve(a1);
reject(a2);
console.log('end');
}, 1000);
});
p.then(value => {
console.log('这是resolve函数体,参数:' + value);
}, reason => {
console.log('这是reject函数体,参数:' + reason);
})
其输出结果为:
.then()函数和.catch()
.then()函数和.catch()都需要Promise对象才能调用,再使用这两个函数的时候,需要注意的地方如下:
1、then函数中,可以编写resolve函数体和reject函数体,也可以只编写resolve函数体。即参数可以为.then(resolve=>{},reject=>{})或.then(resolve=>{}) 这两种。
2、resolve函数返回的是Promise对象,哪怕使用 return ‘bbb’;这样的显式返回,最后也会转成Promise对象返回出去。也可以人工显式指定返回,如以下所示。新返回的Promise对象可以再跟then函数,一直跟下去。如果没有return这条语句,则默认返回对象的参数是undefinded,即res为undefined。
3、reject返回的是空,或者说无返回。因为无返回,故后面跟then或catch函数无意义,也不会执行。
4、多次调用Promise.then()函数,原理一致。传入的数据永远是调用对象的数据。
5、catch函数。该函数有两个作用,一个是等同于then(null,reject=>{});一个是捕获resolve中的异常。
Promise对象的all()
All()函数,顾名思义,就是等所有的对象都成功了(相等于 state1==fulfilled&&state2==fulfilled),才能运行resolve函数。
Promise对象的race()函数
Race()函数,就是谁先完成,就按照谁的指令,进入相应的函数。
以上是学习Promise函数时的一些体会,不一定准确,愿对你有些价值。