参考视频:https://www.bilibili.com/video/BV15741177Eh?p=125
回调地狱
setTimeout(() => { console.log("Hello World"); setTimeout(() => { console.log("Hello Vue"); setTimeout(() => { console.log("Hello Python"); }, 1000); }, 1000); }, 1000);
Promise链式结构
new Promise((resolve, reject) => { // 第一次网络请求 setTimeout(() => { resolve() }, 1000); }).then(() => { // 第一次拿到结果的代码 console.log("Hello World"); console.log("Hello World"); console.log("Hello World"); console.log("Hello World"); console.log("Hello World"); return new Promise((resolve, reject) => { // 第二次网络请求 setTimeout(() => { resolve() }, 1000); }) }).then(() => { // 第二次拿到结果的代码 console.log("Hello Vue"); console.log("Hello Vue"); console.log("Hello Vue"); console.log("Hello Vue"); console.log("Hello Vue"); return new Promise((resolve, reject) => { // 第三次网络请求 setTimeout(() => { resolve() }, 1000); }) }).then(() => { // 第三次拿到结果的代码 console.log("Hello Python"); console.log("Hello Python"); console.log("Hello Python"); console.log("Hello Python"); console.log("Hello Python"); })
Promise三种状态
1、基本使用(可直接看第四种)
<body> <script> // 参数->函数(resolve,reject)都是函数 // 1、连式结构 new Promise((resolve, reject) => { // 回调地狱 // setTimeout(() => { // console.log("Hello World"); // setTimeout(() => { // console.log("Hello Vue"); // setTimeout(() => { // console.log("Hello Python"); // }, 1000); // }, 1000); // }, 1000); // 第一次网络请求 setTimeout(() => { resolve() }, 1000); }).then(() => { // 第一次拿到结果的代码 console.log("Hello World"); console.log("Hello World"); console.log("Hello World"); console.log("Hello World"); console.log("Hello World"); return new Promise((resolve, reject) => { // 第二次网络请求 setTimeout(() => { resolve() }, 1000); }) }).then(() => { // 第二次拿到结果的代码 console.log("Hello Vue"); console.log("Hello Vue"); console.log("Hello Vue"); console.log("Hello Vue"); console.log("Hello Vue"); return new Promise((resolve, reject) => { // 第三次网络请求 setTimeout(() => { resolve() }, 1000); }) }).then(() => { // 第三次拿到结果的代码 console.log("Hello Python"); console.log("Hello Python"); console.log("Hello Python"); console.log("Hello Python"); console.log("Hello Python"); }) // 2、 // 网络请求:aaa -> 处理 // 处理:aaa111 -> 处理 // 处理:aaa222 -> 处理 new Promise((resolve, reject) => { setTimeout(() => { resolve('aaa') }, 1000); }).then(res => { // 1.第一次10行代码 console.log(res, '第一层10行代码'); // 2.对结果进行第一次处理 // 只有resolve可省略reject return new Promise((resolve) => { resolve(res + '111') }) }).then(res => { // 1.第二次10行代码 console.log(res, '第二层10行代码'); return new Promise((resolve) => { resolve(res + '222') }) }).then(res => { console.log(res, '第三层10行代码'); }) // 3.第二种简写 new Promise((resolve, reject) => { setTimeout(() => { resolve('aaa') }, 1000); }).then(res => { // 1.第一次10行代码 console.log(res, '第一层10行代码'); // 2.对结果进行第一次处理 return Promise.resolve(res + '111') }).then(res => { // 1.第二次10行代码 console.log(res, '第二层10行代码'); return Promise.resolve(res + '222') }).then(res => { console.log(res, '第三层10行代码'); }) // 4.简写 new Promise((resolve, reject) => { setTimeout(() => { resolve('aaa') }, 1000); }).then(res => { // 1.第一次10行代码 console.log(res, '第一层10行代码'); // 2.对结果进行第一次处理 // return res + '111' // 如果报错则在此层终止 // return Promise.reject('error message') throw 'error message' }).then(res => { // 1.第二次10行代码 console.log(res, '第二层10行代码'); return res + '222' }).then(res => { console.log(res, '第三层10行代码'); }).catch(err => { console.log(err); }) </script> </body>
2、race方法(多个请求中一个成功就返回)
let p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success') },1000) }) let p2 = new Promise((resolve, reject) => { setTimeout(() => { reject('failed') }, 500) }) Promise.race([p1, p2]).then((result) => { console.log(result) }).catch((error) => { console.log(error) // 打开的是 'failed' })
3、all方法(多个请求都成功才返回)
Promise.all([ // 请求1 new Promise((resolve, reject) => { setTimeout(() => { resolve({ name: 'BlackAngel', age: 20 }) }, 1500); }), // 请求2 new Promise((resolve, reject) => { setTimeout(() => { resolve({ name: 'Smallstars', age: 18 }) }, 1000); }) ]).then(results => { console.log(results); })