Promise用法简介

一,promise基础

promise是异步编程的一种解决方案,假设当遇到ajax请求A的回调函数中嵌套另一个请求B,请求B的回调函数
中又嵌套一个请求C,请求C的回调函数中又嵌套一个请求D,以此最终获取到D回调函数中的data。正常情况下
这种方式可以运行且可以获取我们想得到的结果,但这样的代码在完成后在视觉上不容易看出其中的嵌套关系,
而且在后期不易维护。promise就在一定程度上解决了这种问题。

使用方法(以下用定时器模拟异步操作)

//其中传入的resolve,reject本身也是函数
//reslove函数对应成功调用then函数
//reject函数对应调用失败的catch函数
//在执行异步请求时函数括号内写入data
new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve()
        },1000)
    }).then(()=>{
        console.log('hello word');
        //第一次嵌套
        new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve()
            },1000)
        }).then(()=>{
            console.log('hello Vue')
            //第二次嵌套
            new Promise((resolve, reject) =>{
             setTimeout(()=>{
                 resolve()
             },1000)
            }).then(()=>{
                console.log('hello js')
                //第三次嵌套
                new Promise((resolve, reject) => {
                    setTimeout(()=>{
                        resolve()
                        reject()
                    },1000)
                }).then(()=>{
                    console.log('hello')
                }).catch(()=>{
                    console.log('error')
                })
            })
        })
    })

二,Promise三种状态

异步操作之后会有三种状态

pending:等待状态,如正在进行网络请求或定时器没有到时间

fulfill:满足状态,当我们主动回调reslove时就处于该状态,并会回调.then()

reject:拒绝状态,当我们主动回调了reject时就处于该状态,并会回调.catch()

.then和.catch的另一种写法

 new Promise((resolve, reject) => {
                        setTimeout(()=>{
                            resolve('hello')
                            reject('error')
                        },1000)
                    }).then(data=>{
                        console.log(data)
                    },error=>{
                        console.log(error)
                    })

三,网络请求处理

在请求到数据后对其进行下一步的处理并最后获取结果,使用Promise

//对请求到的数据res分别加上111,然后再加上222
new Promise(resolve => {
        setTimeout(() => {
            resolve('res')
        }, 1000)
    }).then(res => {
        console.log(res)
        //第一次内部处理
        // return new Promise(resolve => {
        //     resolve(res + '111')
        //简写形式
        return Promise.resolve(res + '111')
        //若抛出异常
        //return Promise.reject('error message')
        // 或
        //throw 'error message'
    }).then(res => {
        console.log(res)
        //第二次内部处理
        // return new Promise(resolve => {
        //     resolve(res + '222')
        return Promise.resolve(res + '222')
    }).then(res => {
        console.log(res)
    }).catch(err =>{
        console.log(err) 
    })
    //})
    //})

四,Promise的all方法使用

某个需求依赖于多个网络请求时使用此方法

使用方法

 Promise.all([
        new Promise((resolve, reject) => {
            $ajax({
                url:'url',
                success:function (data){
                    resolve(data)
                }
            })
        }),
        new Promise((resolve, reject) => {
            $ajax({
                url:'url',
                success:function (data){
                    resolve(data)
                }
            })
        })
    ]).then(results =>{
        //第一个请求结果
        console.log(results[0])
        //第二个请求结果
        console.log(results[1])
    })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promise是一种异步编程的解决方案,它可以避免回调地狱,使得异步操作更加清晰和易于维护。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当Promise处于pending状态时,可以转换为fulfilled或rejected状态,一旦转换为其中一种状态,就不可再转换为其他状态。 Promise的基本用法如下: ```javascript const promise = new Promise((resolve, reject) => { // 异步操作 if (/* 异步操作成功 */) { resolve(value); // 将Promise状态设置为fulfilled,并将异步操作的结果传递给回调函数 } else { reject(error); // 将Promise状态设置为rejected,并将错误信息传递给回调函数 } }); promise.then((value) => { // 异步操作成功时的回调函数 }, (error) => { // 异步操作失败时的回调函数 }); ``` 另外,Promise还提供了一些静态方法,如Promise.resolve和Promise.reject,可以方便地创建已经处于fulfilled或rejected状态的Promise对象,以及Promise.all和Promise.race等方法,可以处理多个Promise对象的状态。 下面是一个使用Promise的例子,通过异步加载图片并在加载完成后显示图片: ```javascript function loadImageAsync(url) { return new Promise((resolve, reject) => { const img = new Image(); img.onload = function() { resolve(img); }; img.onerror = function() { reject(new Error('Could not load image at ' + url)); }; img.src = url; }); } loadImageAsync('https://example.com/image.jpg') .then((img) => { document.body.appendChild(img); }) .catch((error) => { console.error(error); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值