promise的简单介绍
1. promise是什么?
promise是解决异步问题的一种解决方案(但是它本身不是异步的),它本质上是一个对象,用于获取异步的一些消息。
promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。
你可以找到更多关于的信息 LaTeX 数学表达式[here][1].
2.promise的特点
2.1 promise的三种状态
一个 Promise 必然处于以下3种状态之一:
待定状态(pending): 初始状态,不是成功状态也不是失败状态。
成功状态(fulfilled): 意味着操作成功完成。
失败状态(rejected): 意味着操作失败。
2.2 状态改变情况
当promise状态从pending,变成其他两种状态中的一种时,就不会再变,任何时候都可以得到这个结果。所以,Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected。
3.promise语法
基本语法
var promise = new Promise(function(resolve, reject) {
// 异步语句
// 异步语句执行结束后、调用resolve 或 reject
});
Promise 对象的创建语法中,包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。
在回调中执行一些操作(例如异步),如果成功,则调用 resolve,它把promise的状态修改为fullfiled。失败则调用 reject,,他把promise的状态修改为rejected。
4.一些基本用法
4.1 then 的用法
链式操作,简化层层回调的写法。
const pro = new Promise((resolve, reject) => {
setTimeout(function(){
var num = Math.ceil(Math.random()*10); //生成1-10的随机数
resolve(num);
}, 1000);
})
pro.then(function(data){
console.log('随机数字是'+data);
return data*2
}).then(function(data1){
console.log('第一个数字的两倍是'+data1);
return data1*2
}).then(function(data2){
console.log('第二个数字的两倍是'+data2);
return data2*2
}).then(function(data3){
console.log('第三个数字的两倍是'+data3);
});
利用定时器异步获取一个数字,1秒后执行完成。第一个then接收传过来的数字,然后输出,并对该数据进行乘2的处理,接着传给下一个then,依次执行上述操作。就得到了下面的运行结果。
运行结果如下:
4.2 reject的用法
reject的作用就是把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。看下面的代码。
下面举一个简单的例子,当小花手中的苹果数大于5时,就不送人,如果小于大于5,就把苹果送给小红。小花手中的苹果数是随机的。
const pro1 = new Promise((resolve, reject) => {
var num = Math.ceil(Math.random()*10); //生成1-10的随机数
console.log('小花有'+num+'个苹果');
if(num<=5){
resolve(num);
}
else{
reject(num);
}
})
const pro2 = pro1.then(data => {
console.log('小花送给小红'+data+'个苹果');
}, err => {
console.log(err+'个苹果,太重了,拿不起,不送了');
})
利用定时器异步获取一个数字,1秒后执行完成,如果数字小于等于5,我们认为是“成功”了,调用resolve修改Promise的状态。否则我们认为是“失败”了,调用reject并传递一个参数,作为失败的原因。
结果1
结果2
4.3 catch的用法
在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。
还有一个作用是用来指定reject的回调。
const pro = new Promise((resolve, reject) => {
var num = Math.ceil(Math.random()*10); //生成1-10的随机数
console.log(num);
if(num<=5){
resolve(num);//成功
}
else{
reject(num);//失败
}
})
pro.then(function(data){
console.log('resolved'+num);
console.log(data);
})
.catch(function(reason){
console.log('rejected'+num);
console.log(reason);
});
如果数字小于等于5,我们认为是“成功”了,调用resolve修改Promise的状态,并进到这个then方法中。否则我们认为是“失败”了,调用reject并传递一个参数,作为失败的原因,并进到这个catch方法中。
结果1
结果2