Prominse的静态方法,Prominse.then的返回值,Prominse的三种状态,async函数,同源策略,get和post传参的区别
Published on 2022-12-05 14:22 in 分类: ajax with 帅气丶汪星人
分类: ajax

Prominse的静态方法,Prominse.then的返回值,Prominse的三种状态,async函数,同源策略,get和post传参的区别

Prominse的静态方法

有两种静态方法:

all和race两种方法,all是返回全部的参数,race是返回最快的参数

复制代码
<script>
    function timeoutPro(delay) {
        return new Promise((resolve, reject) => {
            // 根据成功  resolve then
            setTimeout(() => {
                resolve(`延迟了${delay}秒执行`)
            }, delay * 1000)
        })
    }
    // 创建多个Promise对象
    // p1,p2,p3 Promise对象
    const p1 = timeoutPro(2)
    const p2 = timeoutPro(3)
    const p3 = timeoutPro(4)
    const p4 = timeoutPro(9)
    console.log(p1,p2,p3,p4)
    /*
      1. Promise.all 等待传入的Promise数组,每一项 都完成
      2. 每一个Promisethen的结果,挨个的设置给res
      3. res-->array
      4. all 所有,等所有
    */
    // Promise.all([Promise实例化对象,对象1,对象2])
    Promise.all([p1,p2,p3,p4])//调用所有的Promise对象
        .then(res => {
            console.log(res)
        }) //如果有一个有问题就回去进入err中
    /*
      1. Promise.race 等待传入的Promise数组,第一个 完成就触发then
      2. then中获取到的是 第一个完成Promise对象的then中的值
      3. race 竞赛,等第一
    */
    Promise.race([p1,p2,p3,p4])//调用最快的Promise对象
        .then(res => {
            console.log(res)
        }) //只返回最快的那个接口

</script>
复制代码

Promise和Promise相结合的接口

复制代码
<script>
    function myAxios(option) {
        // 获取传入的属性
        const { url, method = 'get', data } = option
        return new Promise((resolve, reject) => {
            const xhr = new XMLHttpRequest()
            // 调用 新闻接口
            xhr.open(method, url)
            // 设置 请求头 内容格式为JSON
            xhr.setRequestHeader('content-type', 'application/json')
            xhr.addEventListener('load', function () {
                // console.log('load:', xhr.response)
                // 通过 resolve 将成功的结果传递给then
                resolve(JSON.parse(xhr.response))
            })
            // 发送  JSON
            xhr.send(JSON.stringify(data))
        })
    }
    const p1 = myAxios({
        url : `http://ajax-api.itheima.net/api/news`, //获取新闻表单
        method : `GET`,
    })
    const p2 = myAxios({
        url : `http://ajax-api.itheima.net/api/books`, //获取图书列表
        method : `get`,
    })
    const p3 = myAxios({
        url : `http://ajax-api.itheima.net/api/area?pname=河南省&cname=南阳市`,
        method : `get`,
    })
    // 1.测试多个接口
    // 新闻 图书接口 英雄接口
    Promise.all([p1,p2,p3]).then(res => {
        console.log(res)
        console.log(res[0])
        console.log(res[0].data)
        console.log(res[2])
        console.log(res[2].data)
    }).then(err => {
        console.log(err)
    })
</script>
复制代码

Promise.then返回值

复制代码
<script>
    function time(a) {
        return new Promise ((resolve, reject) =>{
            setTimeout(() => {
                resolve(a)
            },1000)
        })
    }
    const  result = time(1).then(res => {
        console.log(res)
        return time(2)
    }).then(res1 => {
        console.log(res1)
        return 1
    }).then(res2 => {
        console.log(res2)
    }).then(res3 => {
        console.log(res3)
    })
</script>
复制代码

Prominse中reject和catch这两个方法

复制代码
<script>
    function randomPro() {
        return new Promise((resolve, reject) => {
            // 延迟 1s
            setTimeout(() => {
                // 随机数
                // Math.random() 0-1的小数
                // * 100 控制范围
                // parseInt 转整数
                const num = parseInt(Math.random() * 100)
                if (num > 0 && num < 50) {
                    resolve('成功啦:' + num)
                } else if (num >= 50 && num <= 100) {
                    reject('失败啦:' + num)
                }
            }, 10)
        })
    }
    /*
      1. then的第二个参数在失败时触发(如果写了的话)
      2. catch的本质 就是调用了then 传递勒第二个参数
    */
    randomPro().then(
        res => console.log('res:', res),
        err => console.log('err:', err),
    ).finally(() => {  //重点,不管成功或者失败,都会走我这里-
        console.log(`成功或者失败都要走我这里`)
    })
</script>
复制代码

Promise的三种状态

复制代码
<script>
    function randomPro() {
        return new Promise((resolve, reject) => {
            // 延迟 1s
            setTimeout(() => {
                // 随机数
                // Math.random() 0-1的小数
                // * 100 控制范围
                // parseInt 转整数
                const num = parseInt(Math.random() * 100)
                if (num > 0 && num < 50) {
                    resolve('成功啦:' + num)
                } else if (num >= 50 && num <= 100) {
                    reject('失败啦:' + num)
                }
            }, 10)
        })
    }
    /*
      1. then的第二个参数在失败时触发(如果写了的话)
      2. catch的本质 就是调用了then 传递勒第二个参数
    */
    // 保存下来 方便后续查看
    const p = randomPro()
    console.log(`初始化状态`,p)
    p.then(res => {
        console.log(res)
            console.log(`成功状态`,p)
        },
        err => {
            console.log(`失败状态`,p)
        }
    ).finally(function () {
        console.log(`我是什么状态`,p)
    })
</script>
复制代码

eventloop,事件循环(宏任务,微任务)

先执行主线程代码,然后执行微任务,最后执行宏任务。如果宏任务中还有其他微任务,则继续执行宏任务中的微任务

script是最大的宏任务,先执行(同步任务,微任务,宏任务)

new Promise{(里面就是同步任务)}

.then是微任务

setTimeout()setInterval()这两个属于宏任务

复制代码
<script>
    // 宏任务
    setTimeout(function () {
        console.log(1)
    })
    new Promise(function (resolve, reject) {
        console.log(2)
        resolve(3)
    }).then(function (val) {
        // 微任务
        console.log(val) // 3
    })
    console.log(4)
</script>
复制代码

 

posted @   帅气丶汪星人  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示