Promise 就是为了解决“回调地狱”问题的,它可以将异步操作的处理变得很优雅。
Promise 可以支持多个并发的请求,获取并发请求中的数据这个 Promise 可以解决异步的问题,本身不能说 Promise 是异步的
定义: 包含异步操作结果的对象
状态:
注意:
- //普通定义
- let ajax = (callback) => {
- console.log('≈')
- setTimeout(() => {
- callback && callback.call();
- }, 1000)
- }
- ajax(() => {
- console.log('timeout')
- })
- // 先会打出 开始执行,1s 后打出 timeout
-
- //Promise
- let ajax = () => {
- console.log("开始执行");
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve();
- }, 1000);
- });
- };
- ajax().then(() => {
- console.log("timeout");
- });
- // 先会打出 开始执行,1s 后打出 timeout
-
- // then()
- let ajax = () => {
- console.log("开始执行");
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve();
- }, 1000);
- });
- };
- ajax()
- .then(() => {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve();
- }, 2000);
- });
- })
- .then(() => {
- console.log("timeout")
- })
- // 先会打出 开始执行,3s(1+2) 后打出 timeout
-
- // catch()
- let ajax = (num) => {
- console.log("开始执行");
- return new Promise((resolve, reject) => {
- if (num > 5) {
- resolve();
- } else {
- throw new Error("出错了");
- }
- });
- };
-
- ajax(6)
- .then(function () {
- console.log("timeout"); // 先会打出 开始执行,1s 后打出 timeout
- })
- .catch(function (err) {
- console.log("catch", err);
- });
-
- ajax(3)
- .then(function () {
- console.log("timeout");
- })
- .catch(function (err) {
- console.log("catch"); // 先会打出 开始执行,1s 后打出 catch
- });
- 复制代码
- //所有图片加载完成后添加到页面
- const 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);
- };
- });
- }
-
- const showImgs = (imgs) => {
- imgs.forEach((img) => {
- document.body.appendChild(img);
- })
- }
-
- Promise.all([
- loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
- loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
- loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
- ]).then(showImgs);
- 复制代码
- //有一个执行完就回加载到页面
- const 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);
- };
- });
- }
-
- const showImgs = (imgs) => {
- let p = document.createElement("p");
- p.appendChild(img);
- document.body.appendChild(p);
- }
-
- Promise.race([
- loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
- loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
- loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
- ]).then(showImgs);
- 复制代码