前言
在我们开发前端项目的时候时常会应用到异步操作,比如ajax网络请求来处理后端数据的业务需求,但是往往产品不会让我们省心,业务需求总是异步同步交叉的,慢慢的我们会发现套了很多层回调来处理业务变成了回调地狱,这样使得我们的代码可读性变低复杂度变高了,这里我推荐使用Promise。
Promise介绍
Promise 是一个构造函数,是异步编程的一种解决方案。所谓Promse,它本身就是一个容器,里面保存着异步操作的结果,对的,这和回调函数类似。
Promise 容器本身不是异步的,而里面封装一个异步任务。他有三种状态,状态不受外界影响,即:
- pending(进行中)
- resolved(成功)
- rejected(失败)
Promise的基本用法
const promise = new Promise((resolve, reject) => {
// 这里做异步任务(比如ajax 请求接口。这里暂时用定时器代替)
setTimeout(function () {
var data = {
retCode: 0,
msg: 'qianguyihao'
}; // 接口返回的数据
if (data.retCode == 0) { // 接口请求成功时调用
resolve(data);
} else { // 接口请求失败时调用
reject({
retCode: -1,
msg: 'network error'
});
}
}, 100);
})
// 接受异步结束后resolve或reject传递的参数
promise.then((data)=>{
console.log('成功'+data)
},(err)=>{
console.log('失败'+err)
})
Promise():Promise构造器主要用于包装不支持promise(返回值不是Promise)的函数。\
resolve作用是:将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;\
reject作用是:将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。\
then:then()方法返回一个Promise。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。
promise.catch((err)=>{
console.log('失败'+err)
})
// 抛出一个错误,大多数时候将调用catch方法
var p1 = new Promise(function(resolve, reject) {
throw 'Uh-oh!';
});
p1.catch(function(e) {
console.log(e); // "Uh-oh!"
});
// 在异步函数中抛出的错误不会被catch捕获到
var p2 = new Promise(function(resolve, reject) {
setTimeout(function() {
throw 'Uncaught Exception!';
}, 1000);
});
p2.catch(function(e) {
console.log(e); // 不会执行
});
// 在resolve()后面抛出的错误会被忽略
var p3 = new Promise(function(resolve, reject) {
resolve();
throw 'Silenced Exception!';
});
p3.catch(function(e) {
console.log(e); // 不会执行
});
catch:catch()方法返回一个Promise,处理失败情况的回调函数和捕获抛出的错误(异步函数中抛出的错误不会被catch捕获到)。
总结
通过使用Promise()构造器,Promise.resolve(),Promise.reject(),Promise.then(),Promise.catch()我们就可以解决回调地狱的问题了。