1、Promise描述与作用
Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和强大。
Promise简单说就是一个容器对象,里面保存着某个未来才会结束的事件(通常是指一个异步操作)结果,由它可以获取异步操作的结果。
es6原生提供了Promise对象,并提供统一的API,各种各样的异步操作都可以用同样的方法进行处理。
所以有了Promise对象我们就可以将异步操作以同步的流程表达出来了,避免了以前在ajax里层层嵌套的在回调函数中一级一级地往下调用要同步操作的接口了。
2、基本语法
1.Promise实例定义:
<script>
// Promise对象接收一个function作为参数,function中有两个固定的参数resolve,reject
// resolve,reject是两个固定的函数,注意不能改名称
const promise = new Promise(function(resolve,reject){
//do somethings
if(/*异步成功*/){
resolve(data);
}else{
reject(error);
}
});
</script>
3、.then .catch方法
在Promise实例生成后,可以在.then方法里分别接收resolve状态和reject状态的回调处理函数
<script>
promise.then(function(data){
//success
},function(error){
//failure
}).catch(function(error){
//catch
});
</script>
4、图片异步加载处理例子
<body>
<div id="contianer"></div>
<script>
var contianer = document.getElementById("contianer");
let loadImage = (url) => {
let promise = new Promise((resole, reject) => {
let image = new Image();
image.src = url;
image.onload = () => {
resole(image);
};
image.onerror = () => {
reject(new Error(`加载图片失败,url${url}`));
}
});
return promise;
}
let promise = loadImage("http://pic1.win4000.com/wallpaper/2020-10-10/5f811d580e1e9.jpg");
promise.then((data) => {
contianer.appendChild(data);
}, (error) => {
console.log(`error,${error}`);
}).catch((error)=>{
console.log(`catch,${error}`);
});
</script>
</body>
5、异步请求API接口例子
<script>
const getJson = function (url) {
// 异步操作
const promise = new Promise(function (resolve, reject) {
const handler = function () {
if (this.readyState !== 4) {
//0 1 2 3 4
return;
}
if (this.status === 200) {
resolve(this.response);
}
else {
reject(new Error(this.statusText));
}
}
const client = new XMLHttpRequest();
client.open("get", url);
client.onreadystatechange = handler;
client.responseText = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
});
return promise;
}
var promise = getJson("http://iwenwiki.com/api/blueberrypai/getChengpinDetails.php");
console.log(promise);
promise.then((data) => {
console.log(data);
}, (error) => {
console.log(`error,${error}`);
}).catch(
(catchError) => {
console.log(`catchError,${catchError}`);
}
);
</script>