如何设置a执行完再执行b
- 回调
- 事件触发
- Promise
Promise是用来解决异步操作问题的。
Promise含义
- Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大
- 所谓
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果 - promise 是一个对象,从它可以获取异步操作的消息
- Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Promise</title>
</head>
<body>
<script>
//es5中的回调
//回调的写法复杂,代码的复杂影响了后期的维护
{
let ajax = function (callback) {
console.log('carry out');
setTimeout(() => {
callback && callback();
}, 1000);
}
ajax(function () {
console.log('timeout and callback');
});
//carry out
//timeout and callback
}
//上面的代码用Promise的写法
//返回一个实例,这个实例具有then方法,执行下一步的功能
// resolve要执行下步的操作
// reject要中断当前操作
{
let ajax = function () {
console.log('carry out1');
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 1000);
});
}
ajax().then(function () {
console.log('promise carryout');
});
//carry out1
//promise carryout
}
//多步调用的场景
{
let ajax = function () {
console.log('carry out2');
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 1000);
});
}
ajax()
.then(function () {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, 1000);
});
})
.then(function () {
console.log('promise carryout2');
});
//可以不断得向下写
//carry out2
//promise carryout
//promise carryout2
}
//捕获错误
{
let ajax = function (num) {
console.log('carry out3');
return new Promise((resolve, reject) => {
if (num > 5) {
resolve();
} else {
throw Error('出错了,num不大于5');
}
});
}
ajax(6)
.then(() => {
console.log(6);
}).catch((err) => {
console.log(err);
});
ajax(3)
.then(() => {
console.log(3);
}).catch((err) => {
console.log(err);
});
//出错了,num不大于5
}
</script>
</body>
</html>
Promise.all() Promise.race()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Promise</title>
</head>
<body>
<script>
//Promise.all() and Promise.race()
//所有图片加载完再添加到页面
{
function loadImg(src) {
return new Promise((resolve, reject) => {
let img = document.createElement('img');
img.src = src;
img.onload = function () {
resolve(img);
};
img.onerror = function (err) {
reject(err);
}
});
}
function showImgs(imgs) {
imgs.forEach(function (item) {
document.body.appendChild(item);
});
}
Promise.all([
loadImg('https://static.easyicon.net/preview/122/1225468.gif'),
loadImg('https://static.easyicon.net/preview/121/1219130.gif'),
loadImg('https://static.easyicon.net/preview/120/1209057.gif')
]).then(showImgs);
}
//Promise.race()
//有一个图片加载完就加载到页面上
{
function loadImg(src) {
return new Promise((resolve, reject) => {
let img = document.createElement('img');
img.src = src;
img.onload = function () {
resolve(img);
};
img.onerror = function (err) {
reject(err);
}
});
}
function showImgs(img) {
document.body.appendChild(img);
}
Promise.race([
loadImg('https://static.easyicon.net/preview/122/1225468.gif'),
loadImg('https://static.easyicon.net/preview/121/1219130.gif'),
loadImg('https://static.easyicon.net/preview/120/1209057.gif')
]).then(showImgs);
}
</script>
</body>
</html>