JavaScript 基础和高级教程
Promise 用来传递异步操作的消息
在实际的使用中,有非常多的应用场景我们不能立即知道应该如何继续往下执行。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API可供进一步处理
需求
- 解决回调地狱
- 为了代码更加具有可读性和可维护性,我们需要将数据请求与数据处理明确的区分开来
状态
- pending: 等待中或者进行中,表示还没有得到结果
- resolved(Fulfilled): 已经完成,表示得到了我们想要的结果可以继续往下执行
- rejected: 也表示得到结果,但是由于结果并非我们所愿因此拒绝执行
这三种状态不受外界影响,而且状态只能从pending改变为resolved或者rejected,并且不可逆
var promise = new Promise(function(resolve, reject) {
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
promise.then(function(value) {
// success
}, function(value) {
// failure
});
基本的API
- Promise.resolve()
- Promise.reject()
- Promise.prototype.then()
- Promise.prototype.catch()
- Promise.all() 所有的完成
- Promise.race() 完成一个即可
//请求某个table数据
function requestTableList(){
var p = new Promise((resolve, reject) => {
//去后台请求数据,这里可以是ajax,可以是axios,可以是fetch
resolve('Hello');
});
return p;
}
//延时函数,用于给请求计时 10s
function timeout(){
var p = new Promise((resolve, reject) => {
setTimeout(() => {
reject('请求超时');
}, 10000);
});
return p;
}
Promise.race([requestTableList(), timeout()]).then((data) =>{
//进行成功回调处理
console.log(data);
}).catch((err) => {
// 失败回调处理
console.log(err);
});