一、什么是Promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
Promise对象有以下两个特点。
**(1)对象的状态不受外界影响。**Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
**(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。**Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
Promise也有一些缺点。
首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
如果某些事件不断地反复发生,一般来说,使用 Stream 模式是比部署Promise更好的选择。
二、基本用法
1.ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
2.Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
三、前后端数据交互中利用$.ajax封装方法**
html部分
<section class="video">
<h1>第一个数据请求</h1>
<div class="title"></div>
</section>
<hr>
<h1>第二个数据请求</h1>
<ul class="list">
<li></li>
<li></li>
<li></li>
</ul>
js部分
<script src="./juqery.js"></script> //y引入jQuery文件
<script>
let lists = $(".list")
//定义接口地址
const img_Url = "https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata"
const video_Url = "https://api.apiopen.top/videoRecommend?id=127398"
1. Promise.all方法
function createPromise(url) {
return new Promise((resolve, reject) => {
$.ajax({
url,
dataType: 'json',
success(data) {
resolve(data)
},
error(err) {
reject(err)
}
})
})
}
Promise.all([
createPromise(img_Url),
createPromise(video_Url)
])
.then((arr) => {
alert('全成功了')
let [res1, res2] = arr //ES6 解构赋值
console.log(res1);
console.log(res2);
//请求的第一个数据渲染到第一页面
let html = ''
res1.message.forEach(element => {
// console.log(element);
html += `<img src="${element.image_src}" alt="">`
});
lists.html(html);
//请求的第一个数据渲染到第二页面
console.log(res2.result[1].data.title);
$('.title').html(res2.result[1].data.title)
},
() => {
alert('至少有一个失败了')
})
2. jQuery提供Promise简便方法
Promise.all([
$.ajax({ url: img_Url, dataType: 'json' }),
$.ajax({ url: video_Url, dataType: 'json' })
]).then(res => {
let [res1, res2] = res //ES6 解构赋值
console.log(res1);
console.log(res2);
// 请求的第一个数据渲染到第一页面
let html = ''
res1.message.forEach(element => {
// console.log(element);
html += `<img src="${element.image_src}" alt="">`
});
lists.html(html);
//请求的第一个数据渲染到第二页面
console.log(res2.result[1].data.title);
$('.title').html(res2.result[1].data.title)
}, err => {
console.log(err);
})