Generator + Promise 实现 async await 效果

文章介绍了async函数和await关键字在处理异步操作中的作用,它们如何与Promise结合使用。async函数在遇到await时会暂停执行,等待Promise解决后继续。Generator函数则提供了一种可暂停执行的机制,通过yield表达式处理异步任务。文章通过示例展示了如何使用Generator和Promise实现相同的效果,并引入了co函数进行递归封装。
摘要由CSDN通过智能技术生成

async 是 ES7 才有的与异步操作有关的关键字,和 Promise , Generator 有很大关联的

async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。

await 操作符用于等待一个 Promise 对象, 它只能在异步函数 async function 内部使用

async awit 使用示例
asyncfunctiongetResult() {
    awaitnewPromise((resolve, reject)=>{
        setTimeout(() => {
            resolve(1)
            console.log(1);
        }, 1000);
    })
    awaitnewPromise((resolve, reject)=>{
        setTimeout(() => {
            resolve(2)                    
            console.log(2);
        }, 500);
    })
    awaitnewPromise((resolve, reject)=>{
        setTimeout(() => {
            resolve(3)
            console.log(3);
        }, 100);
    })
}
getResult() // 1 2 3

Generator + Promise 实现相同效果

// Generator 函数不同于普通函数,是可以暂停执行的,所以函数名之前要加星号 *,以示区别。

// yield是JS为了解决异步调用的命令。表示程序执行到这里会交出执行权,等待结果返回。它需要在协程Generator 函数中运行。

// 整个 Generator 函数就是一个封装的异步任务,或者说是异步任务的容器。异步操作需要暂停的地方,都用 yield 语句注明。

function*getResult() {
    yieldnewPromise((resolve, reject)=>{
        setTimeout(() => {
            resolve(1)
            console.log(1);
        }, 1000);
    })
    yieldnewPromise((resolve, reject)=>{
        setTimeout(() => {
            resolve(2)
            console.log(2);
        }, 500);
    })
    yieldnewPromise((resolve, reject)=>{
        setTimeout(() => {
            resolve(3)
            console.log(3);
        }, 100);
    })
}
constgen=getResult()
// gen.next() = {value: yield 返回的数据, done: 迭代器是否走完}
// gen.next().value 就是每一次 yield 之后返回的 Promise
​
// 递归封装
functionco(g) {
    constnewObj=g.next()
    // 递归停止条件: 当迭代器到最后一个yield
    if (newObj.done) {
        return
    }
    nextObj.value.then(()=>{
        co(g)
    })
}
​
co(gen) // 1 2 3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值