Promise、async、await

function a(){
    return 'a'
}
function b(){
    //return 'b'
    setTimeout(()=>{
        return 'b'
    },3000)
}
function c(){
    return 'c'
}
function run(){
    cc.log(a())
    cc.log(b())
    cc.log(c())
}

对于上面的代码,执行run()函数后发现:

a()和c()不会等到b()执行完再一起输出

这样b()就只会返回undefine

当我们在b()中使用promise后:

function b(){
    //return 'b'
    // setTimeout(()=>{
    //     return 'b'
    // },3000)
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve('b')
        },3000)
    })
}

结果:

undefine变成了Promise(pending的状态),所以promise可以用来处理一些异步任务,解决异步写法中的嵌套问题(回调地狱)

异步任务会在当前的同步任务都处理完成之后在执行。

  • 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。

  • 成功(fulfilled): 意味着操作成功完成。

  • 失败(rejected): 意味着操作失败。

 async和await可以让b()实现完c()再实现:

function a(){
    return 'a'
}
function b(){
    //return 'b'
    // setTimeout(()=>{
    //     return 'b'
    // },3000)
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve('b')
        },3000)
    })
}
function c(){
    return 'c'
}
async function run(){
    cc.log(a())
    cc.log(await b())
    cc.log(c())
}

结果:

由此可知:async和await可以使让b()执行完之后再去执行c()

promise中的resolve,reject参数:

resolve可以理解为成功时候的一个工具,reject是失败时候要使用的一个工具,每个promise都具备一个状态的概念,像pending、fulfilled、rejected。

在开发过程中,无论是同步和异步任务,执行过后都会有成功、失败,取决于代码的逻辑,比如向服务端请求一个数据,如果我拿到的是正确的数据,那这就是成功的,

如果给服务端的身份认证信息没有通过,或者请求次数过多,或者服务端觉得参数有问题,会给你返回一个失败的信息,意味着后续操作是不能执行的,这就是失败的状态。

那在请求的过程中,可能因为网速慢等原因,信息没有返回,就判定不了成功和失败,处于pending的状态。

使用resolve,reject:

resolve() 是一个函数对象方法,意味着只能用在函数对象 Promise 上。它接收一个 value 参数,返回一个这个给定值解析后的 Promise 对象。

reject() 方法返回一个失败的 Promise 对象,接收一个 value 参数,表示失败的原因。

语法:

        const p1 = new Promise((resolve,reject)=>{
            resolve('成功')
            reject('失败')
        })

那‘成功’‘失败’这些参数要怎么用呢?

Promise提供了then 方法和catch方法来分别处理resolve()、reject(),都绑定在原型 prototype 上,意味着是一个实例方法,必须在实例对象上才能使用:

resolve():

        const p1 = new Promise((resolve,reject)=>{
            resolve('成功')
            //reject('失败')
        })
        p1.then(data=>{
            cc.log(data);
        })

reject(): 

        const p1 = new Promise((resolve,reject)=>{
            //resolve('成功')
            reject('失败')
        })
        p1.then(data=>{
            cc.log(data);
        })
        .catch(data=>{
            cc.log(data)
        })

因为Promise返回resolve()之后会触发then方法,返回reject()之后会触发catch方法,所以上面运行之后分别会输出‘成功’、‘失败’,

异步任务分解:

promise可以有效地减少嵌套的总层数,p1.then().then()哪怕里面有再多的异步任务,也只是在一层里面:

        const p1 = new Promise((resolve,reject)=>{
            resolve('成功1')
            //reject('失败')
        })
        p1.then(data=>{
            cc.log(data);
            return new Promise((resolve,reject)=>{
                resolve('成功2')
            })
        })
        .then(data=>{
            cc.log(data);
        })

结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值