4小时快速掌握ES6核心用法 - 1.17 promise的基本用法

1.17 promise的基本用法

1. Promise 它其实就是一个容器,里面保存着某个未来才会结束的事件(异步操作)的结果
各种异步操作都可以用同样的方法进行处理 axios
Promise接收一个函数作为参数,默认的relove和reject分别是两个函数


romise对象有以下两个特点。1.对象的状态不受外界影响 2.一旦状态改变,就不会再变,任何时候都可以得到这个结果
处理异步操作三个状态: Pending(进行) Resolved(成功) Rejected(失败)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>1.17 promise的基本用法</title>
</head>

<body>
    <script>
        // 1. Promise 它其实就是一个容器,里面保存着某个未来才会结束的事件(异步操作)的结果
        // 各种异步操作都可以用同样的方法进行处理 axios
        // Promise接收一个函数作为参数,默认的relove和reject分别是两个函数

        // romise对象有以下两个特点。1.对象的状态不受外界影响 2.一旦状态改变,就不会再变,任何时候都可以得到这个结果
        // 处理异步操作三个状态: Pending(进行) Resolved(成功) Rejected(失败)

        let pro = new Promise(function(resolve,reject) {
            // .....一坨代码 来模拟异步

            let res = {
                code:200,
                data:{
                    name: 1,
                }
            }
            setTimeout(() => {
                if(res.code === 200){
                    resolve(res.data);
                }else{
                    reject('失败',res.error);
                }
            }, 1000);
            // if(成功的 1===1){

            //     resolve('成功');
            // }else{
            //     reject('失败');
            // }
        }); 

        console.log(pro);
        pro.then(function (value) {
        // success
        console.log(value); // 输出:{name: 1}

        },function(err) {
        // error
        })

        // 为什么改造? 因为上述代码 不能传参
        /*  function timeout(ms) {
                return new Promise((resolve, reject) => {
                    setTimeout(() => {
                        resolve('hello world')
                    }, ms);
                })
            }
            timeout(1000).then((value) => {
                console.log(value);
         }) */


        // Promise对象的实例
        // const getJSON = function (url) {
        //     return new Promise((resolve, reject) => {
        //         const xhr = new XMLHttpRequest();
        //         xhr.open('GET', url);
        //         xhr.onreadystatechange = handler;
        //         xhr.responseType = 'json';
        //         xhr.setRequestHeader('Accept', 'application/json');
        //         xhr.send();

        //         function handler() {
        //             console.log(this.readyState);
        //             if (this.readyState !== 4) {
        //                 return;
        //             }
        //             if (this.status === 200) {
        //                 resolve(this.response);
        //             } else {
        //                 reject(new Error(this.statusText));
        //             }
        //         }
        //     })
        // }
        /* getJSON('https://free-api.heweather.net/s6/weather/now?location=beijing&key=4693ff5ea653469f8bb0c29638035976')
            .then((json) => {
                console.log(json);

            }, function (error) {
                console.error(error);

            }) */

        // then()方法
        // then()方法的第一个参数是resolve的回调函数,第二个参数(可选) 是reject状态的回调函数
        // then方法返回的一个新的Promise实例,可以采用链式写法
        /* getJSON('https://free-api.heweather.net/s6/weather/now?location=beijing&key=4693ff5ea653469f8bb0c29638035976')
            .then((json)=>{
                return json.HeWeather6;
            }).then((HeWeather6)=>{
                console.log(HeWeather6);
            }) */

        // catch() 等价于 then(null,err=>{})
        /*  getJSON('https://free-api.heweather.net/s6/weather/now?location=beijing&key=4693ff5ea653469f8bb0c29638035976')
                .then((json) => {
                    console.log(json);
                }).catch(err=>{
                    console.log(err);   
             }) */

        //  其它方法
        // resolve() reject() all() rece()  done()  finally()
        // (1)resolve()方法将现有对象转换为Promise对象
        // let p = Promise.resolve('foo');
        // 等价于 new Promise(resolve=>resolve('foo'));

        /* console.log(p);
        p.then((val)=>{
            console.log(val);
        }) */

        // (2)reject())方法也会返回一个新的Promise实例
        // let p2 = Promise.reject(new Error('出错了'));

        // p2.catch(err => {
        //     console.log(err);
        // })

        // Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调
        // let Promise1 = new Promise(function (resolve, reject) {})
        // let Promise2 = new Promise(function (resolve, reject) {})
        // let Promise3 = new Promise(function (resolve, reject) {})

        // let p3 = Promise.all([Promise1, Promise2, Promise3])

        // p3.then(() => {
        //     // 三个都成功 则成功
        // }).catch(err => {
        //     // 只要有失败,都失败
        // })
        // 应用场景:一些游戏类的素材比较多的应用,打开网页时,预先加载需要用到的各种资源如图片、flash以及各种静态文件。
        // 所有的都加载完后,我们再进行页面的初始化。

        // race()方法

        //race的应用场景:比如我们可以用race给某个异步请求设置超时时间,并且在超时后执行相应的操作

        //请求某个图片资源
        /*    function requestImg(imgSrc) {
                var p = new Promise((resolve, reject) => {
                    var img = new Image();
                    img.onload = function () {
                        resolve(img);
                    }
                    img.src = imgSrc;
                });
                return p;
            }
           //延时函数,用于给请求计时
        function timeout() {
            var p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    reject('图片请求超时');
                }, 5000);
            });
            return p;
        }
        Promise.race([requestImg('images/2.png'), timeout()]).then((data) => {
            console.log(data);
        }).catch((err) => {
            console.log(err);
           }); */


        // done() 处于回调函数的末端,保证抛出任何可能出现的错误


        // finally方法用于指定不管Promise对象最后状态如何,都会执行的操作。
        // 它与done方法的最大区别,它接受一个普通的回调函数作为参数,该函数不管怎样都必须执行。

        /*server.listen(0)
        .then(function () {
        // run test
        })
        .finally(server.stop);
        */
    </script>
</body>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值