ES6之Promise详解

2020-06-06  本文已影响0人  我爱阿桑
1. 什么是promise?
  • promise是es6新增的异步编程解决方案,在代码中表现为一个对象。

需求:从网络上加载3个资源, 要求加载完资源1才能加载资源2, 加载完资源2才能加载资源3, 前面任何一个资源加载失败, 后续资源都不加载
从前都这样做

 function request(fn) {
        setTimeout(function () {
            fn("拿到的数据");
        }, 1000);
    }
    request(function (data) {
        console.log(data, 1);
        request(function (data) {
            console.log(data, 2);
            request(function (data) {
                console.log(data, 3);
            });
        });
    });

2. 接下来promise闪亮登场!!!

promise就是为了避免层层回调,将异步操作可以变为同步流程来显示的。

  function request() {
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve("拿到的数据");
            }, 1000);
        });
    }
    request().then(function (data) {
        console.log(data, 1);
        return request();
      }).then(function (data) {
        console.log(data, 2);
        return request();
     }).then(function (data) {
        console.log(data, 3);
     });

3. 如何创建promise呢?

new Promise(function(resolve, reject){});就创建完毕了。
记住,promise不是异步的,只要创建了promise对象就会立即执行存放的代码。


4. promise如何通过同步流程来表示异步的操作的呢?

promise对象是通过状态的改变来实现的,只要状态改变就会自动触发对应的函数。


5. promise的三种状态

6. 监听promise状态变化

resolved --->then()
rejected --->catch()


7. then()方法
 promise.then(function () {
        console.log("成功");
    }, function () {
        console.log("失败");
    });
      let promise = new Promise(function (resolve, reject) {
       // resolve("111"); // 将状态修改为成功
       reject("aaa"); // 将状态修改为失败
     });
      let p2 = promise.then(function (data) {
       console.log("成功1", data);
       return "222";
      }, function (data) {
         console.log("失败1", data);
         return "bbb";
     });
       p2.then(function (data) {
         console.log("成功2", data);
        }, function (data) {
         console.log("失败2", data);
     });

上述打印结果就是 :失败1 aaa , 成功2 bbb

let promise = new Promise(function (resolve, reject) {
        resolve("111"); // 将状态修改为成功
        // reject("aaa"); // 将状态修改为失败
    });
    let ppp = new Promise(function (resolve, reject) {
        // resolve("222"); // 将状态修改为成功
        reject("bbb"); // 将状态修改为失败
    });
    let p2 = promise.then(function (data) {
        console.log("成功1", data);
        return ppp;
    }, function (data) {
        console.log("失败1", data);
        return "bbb";
    });
    p2.then(function (data) {
        console.log("成功2", data);
    }, function (data) {
        console.log("失败2", data);
    });

上述打印结果就是 :成功1 111 , 失败2 bbb

let promise = new Promise(function (resolve, reject) {
        // resolve(); // 将状态修改为成功
        reject(); // 将状态修改为失败
    });
    promise.then(function () {
        console.log("成功1");
    }, function () {
        console.log("失败1");
    });
    promise.then(function () {
        console.log("成功2");
    }, function () {
        console.log("失败2");
    });
打印结果是成功1  成功2
8. catch()方法
 let promise = new Promise(function (resolve, reject) {
        // resolve(); // 将状态修改为成功
        reject(); // 将状态修改为失败
    });
    promise.catch(function () {
        console.log("abc");
    });
let promise = new Promise(function (){
   reject('123')
})
promise.catch(function(data){
    console.log(data)
})
let promise = new Promise(function (resolve, reject) {
        reject();
    });
    promise.catch(function () {
        console.log("失败1");
    });
    promise.catch(function () {
        console.log("失败2");
    });
    promise.catch(function () {
        console.log("失败3");
    });
  
9. all()方法
 let arr = [
        "http://www.it666.com/files/system/block_picture_1555415767.png",
        "http://www.it666.com/files/system/block_picture_1555422597.jpg",
        "http://www.it666.com/files/system/block_picture_1555419713.jpg"
    ];
    function loadImage(url) {
        return new Promise(function (resolve, reject) {
            let oImg = new Image();
            let time = Math.random() * 1000;
            // console.log(time);
            setTimeout(function () {
                oImg.src = url;
            }, time);
            // oImg.src = url;
            oImg.onload = function () {
                resolve(oImg);
            }
            oImg.onerror = function () {
                reject("图片加载失败了");
            }
        });
    }
  Promise.all([loadImage(arr[0]), loadImage(arr[1]),loadImage(arr[2])])
        .then(function (result) {
            // console.log(result);
            result.forEach(function (oImg) {
                document.body.appendChild(oImg);
            });
        })
        .catch(function (e) {
            console.log(e);
        });
结果是: 1591432874(1).jpg
上一篇 下一篇

猜你喜欢

热点阅读