2020/7/22 Promise

Promise.then也是一个Promise,但是除了第一个then根据状态来回调的,Promise.then().then…都是执行成功回调

    new Promise((resolvereject=> {

        reject("失败")

 

    }).then(msg => {

        console.log(msg);

    }, error => {

        console.log(error); //执行失败

    }).then(a => {

        console.log('成功'); //执行成功

    }, b => {

        console.log('失败');

    }).then(a => {

        console.log('成功'); //执行成功

    }, b => {

        console.log('失败');

    })

 

 

Promise链式结构  成功可通过return  传递个下一个then回调 不return后面成功回调函数就拿不到,可以做处理再return 给下一层

 

 

还可以return一个Promise对象 return 出来的就是她的状态,上一级成功的回调就会执行下一级的成功回调

    new Promise((resolvereject=> {

        resolve('成功1')

    }).then(msg => {

        return new Promise((resolvereject=> {

            resolve('解决')

        })

    }).then(a => {

        console.log(a); //解决

    })

 

直接return  后面的then默认调用成功的回调

 

    new Promise((resolvereject=> {

        reject('...')

    }).then(msg => {}, error => {

        //return error; 这个默认后面的then默认调用成功的回调

        return new Promise(nullerror => {

            error('///'); //这样才会让后面的then调用失败的回调

        })

    }).then(a => {

        console.log(a);

    }, b => {

        console.log('失败');

    })

 

 

后面的then就是对前面返回的promise的处理

 

除了返回标准的promise对象外,返回自身参数,还可返回别的类型

可返回对象,一样能被下面then接收到,返回 then 会封装成promise对象

    new Promise((resolvereject=> {

        reject('...')

    }).then(msg => {}, error => {

        return {

            then(resolvereject) {

                reject('失败')

            }

        };

    }).then(a => {

        console.log('a' + a);

    }, b => {

        console.log('b' + b); //b失败

    })

 

 

封装ajax的异步请求 可以按序的请求接口数据

 

 

Promise 错误监测,与catch的使用

 

用then的错误回调能打印错误结果,用catch()  代替then的错误回调也是可以的

    new Promise((resolvereject=> {

        //reject("错误");

        //reject(new Error("promise"))

        // throw new Error('fail');

        //hd + 1;系统自动抛异常

    }).then(msg => {}).catch(error => {

        console.log(error);

    })

用失败的回调,回调结束了  就不会到catch里面的

    new Promise((resolvereject=> {

        reject("错误");

        //reject(new Error("promise"))

        // throw new Error('fail');

        //hd + 1;系统自动抛异常

    }).then(msg => {}, resonse => {

        console.log("a"resonse);

    }).catch(error => {

        console.log("b"error);

    })

 既catch前面没有错误的捕获处理,就到catch来解决,前面有错误的捕获,就论不到catch,所以推荐把catch放到最后来捕获

上述几种情况,不管是rejec() 还是throw new Error() 等 都能被捕获到错误

finally实现异步加载动画:在发送请求的时候可以显示动画,最后在finally()函数中将动画取消,不管获取失败还是成功动画总会在获取时显示 最后消失

finally() 不管成功还是失败都会执行

    new Promise((resolve, reject) => {

        resolve('成功')

    }).then(msg => {

        console.log('b', msg);

    }, resonse => {

        console.log("a", resonse);

    }).finally(() => {

        console.log('永远执行');

    })

promise 异步加载图片

 

var  ig =new Image(); 创建一个Image对象就会生成一个<img>标签

常见属性可以添加的有: src,width,height,align,alt,name,border...

常见事件:onabort onerror onload

 

   function loadImage(src) {

        return new Promise((resolve, reject) => {

            const image = new Image();

            // image.onload = () => {

            //     resolve(image)

            // };

            image.onload = resolve(image); //俩中写法

            image.src = src;

            image.onerror = reject;

            document.body.appendChild(image);

        })

    }

    loadImage('./car1.jpg').then(image => {

        image.style.border = '5px solid' //成功的回调

    })

promise 封装定时器

不是所有的回调都是放到队列中 稍后执行

同步的回调函数不会 稍后执行 异步的才会放到队列中

如forEach遍历 就是同步的回调 就不会稍后执行

常见内置错误:

 

没有捕获错误的时候Uncaught错误后面代码不会再执行

新建文本文档.html:19 Uncaught ReferenceError: a is not defined

ReferenceError: 引用不存在的变量错误

              Uncaught ReferenceError: a is not defined

TypeError:类型错误 比如不是对象还以对象的类型输出

           Uncaught TypeError: Cannot read property 'xx' of undefined

RangeError:数据不在范围内  如递归死循环 超出最大递归次数

           Uncaught RangeError: Maximum call stack size exceeded

SyntaxError: 语法错误

           Uncaught SyntaxError: Unexpected end of input

error是个对象 直接打印error 会默认调用error.  stack 显示,可以在debugger里看清楚error对象,她的构造函数就是错误类型

 

 自定义错误throw new Error()抛出 再来捕获 new错误的时候最好是Error()不需要细化到具体哪个类型错误

    function somthing() {
        if (Date.now() % 2 === 1) {
            console.log('正常');
        } else {
            throw new Error('有错')
        }
    }

    try {
        somthing();
    } catch (error) {
        alert(error.message)
    }

从语法上来:Promise是一个构造函数

从功能上说:Promise对象用来封装一个异步操作并获取其结果

流程图:

onResolved  onRejectd 是真正的函数名

 

为什么要用Promise?

第一:

相对于传统的纯回调函数时间上更灵活。  获取到了数据可以晚点再执行回调,3s获得了数据,但是5s之后再执行回调可以,而传统函数必须再启动异步任务前就指定好回调函数,一旦拿到结果就马上回调了

第二:

支持链式调用,支持解决回调函数地狱问题。回调地狱是回调函数的嵌套,上一个函数的结果作为下一个函数的条件

链式调用时候就可以解决这个问题,并且只要写一个catch来进行最后的错误回调

一个Promise对应一个异步任务

回调地狱的终极解决方法:因为promise还有回调函数 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太想进步了

新人菜鸡一枚,相互学习进步啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值