提示:在js中,promise对象是用于处理异步操做的一种方式,它在ES6中被正式引入,现在已经成为了前端开发中非常重要的一部分
一、Promise能做什么?
promise对象提供异步操做的最终完成或者失败,并且可以用一种更加优雅的方式处理异步调用,可以有效的避免回调地狱的情况。
二、Promise对象的特性
1.Promise对象有三种状态
- pending(进行中)、resolved(已完成)、rejected(已失败)
- 一旦Promise对象状态变为resolved或者rejected,就不能再变为其他状态了,而且会一直保持这个状态
- Promise对象可以通过`.then()`方法来处理resolved状态,通过`.catch()`方法来处理rejected状态
2.promise对象的使用
代码如下(示例):
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
const num = Math.random();
if (num > 0.5) {
resolve(num);
} else {
reject('数字小于0.5');
}
}, 1000);
});
promise.then((num) => {
console.log(`得到了一个大于0.5的随机数字:${num}`);
}).catch((error) => {
console.error(`发生了一个错误:${error}`);
});
在这个例子中,我们创建了一个Promise对象,它会在1秒中之后返回一个随机数字,如果随机数字大于0.5,Promise对象就会进入resolved状态,返回这个数字;如果随机数字小于0.5,则Promise对象进入rejected状态,返回一个错误信息。我们通过`.then()`方法来处理Resolved状态,通过`.catch()`方法来处理Rejected状态。
3.Promise对象的链式调用
先了解一下什么是回调地狱。在实际项目中,我们需要根据第一个网络请求的结果,再去执行第二个网络请求,拿着第二个请求的结果再去执行第三个请求。那么代码应该长这样
请求1 (function (请求结果1) {
请求2 (function (请求结果2) {
请求3 (function (请求结果3) {
...
})
})
})
实际应用中,每一个请求都会对请求数据进行处理,这样代码就会变得十分难看臃肿,而且基本上这段代码无法复用,如果业务需求再复杂一些,这个请求就要一直叠加下去。
那Promise对象是如何解决这个问题的,写法如下
new Promise (请求1)
.then(请求2(请求结果1))
.then(请求3(请求结果2))
.then(请求4(请求结果3))
.then(请求5(请求结果4))
.catch(...// 处理异常)
不难看出`.then()`方法本身就会返回一个新 promise ,所以Promise 对象必须 reslove
一个值才可以被之后的 then
接收。(如果没有 return 数据,下一个 then 接收的值就是 undefined
)
总结
提示:本文简单阐述了一下promise的使用方法,及可以解决的问题,力求简洁,起到抛砖引玉的作用。