1. 首页

理解promise、 generator 、async & await 之间的联系

Promise 处理异步代码相对于纯回调函数比较有序明了,但是对于同步函数写法还是挺繁琐的,下面有两种语法糖让异步更加清晰简洁

生成器

generator 函数

像指针一样下移,有点像在debug代码

function* gen() {
    yield 1
    yield 2
    yield 3
}
let g = gen()
console.log(g.next())
console.log(g.next())
console.log(g.next())
console.log(g.next())

理解promise、 generator 、async & await 之间的联系

  • 中断并完成下移return()
function* gen() {
    yield 1
    yield 2
    yield 3
}
let g = gen()
console.log(g.next())
console.log(g.next())
console.log(g.return('完成'))
console.log(g.next())

理解promise、 generator 、async & await 之间的联系

  • 中断并抛出异常 throw()
function* gen() {
    try {
        yield 1
        yield 2
        yield 3
    } catch(e) {
        console.log(e)
    }

}
let g = gen()
console.log(g.next())
console.log(g.next())
console.log(g.throw('异常'))
console.log(g.next())

理解promise、 generator 、async & await 之间的联系 如果在异步函数里面使用 generator 函数怎样?

function promise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
          resolve('resolved')
    }, 1000)
  })
}

function* generate() {
     promise().then((res) => {
    console.log(res)
  })
}

function fn() {
  const res = generate().next()
  console.log(res)
}

fn()

理解promise、 generator 、async & await 之间的联系

现在发现,异步代码不需要then回调了,看起来和同步函数写法一样

不过现在我们有了asyncawait函数,将生成器进一步封装,也可以说出语法糖

async、await函数

使用Promise 写法写一个简单的例子

function promise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
          resolve('resolved')
    }, 1000)
  })
}

function fn() {
     promise().then((res) => {
    console.log(res)
  })
}

fn()

理解promise、 generator 、async & await 之间的联系

改写成 async 函数

async function asyncFn() {
  console.log(await promise())
}

asyncFn()

理解promise、 generator 、async & await 之间的联系

async 和 then 一样 可以达到同一个的效果,而且代码中没有回调函数的影子了

多条异步链的情况

function promise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
          resolve(1)
    }, 1000)
  })
}

function fn() {
     const p =  promise().then((res) => {
        console.log('第一个then', res)
        return res === 2 ? new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(2)
        }, 500)
           }) : new Promise((resolve, reject) => {
        setTimeout(() => {
          reject(3)
        }, 500)
           })
  }).then((res) => {
    console.log('第二个then', res)
  }).catch((err) => {
    console.log('异常', err)
  })
}

fn()

理解promise、 generator 、async & await 之间的联系

使用 async 改写

function promise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
          resolve(1)
    }, 1000)
  })
}

function promise2() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
          resolve(2)
    }, 500)
  })
}

function promise3() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
          resolve(3)
    }, 500)
  })
}

async function asyncFn() {
    const step1_res = await promise()
    console.log('第一步的结果:', step1_res)
    try {
    if (step1_res === 2) {
      console.log('第二步的结果:', await promise2())
    } else {
            console.log('第二步的拒绝的结果:', await promise3())
    }
     }
    catch(err) {
        console.log('异常:',  err)
    }
}
asyncFn()

理解promise、 generator 、async & await 之间的联系

用同步的代码写出了异步的效果

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:理解promise、 generator 、async & await 之间的联系

链接:https://www.javascriptc.com/3781.html

« 这些webpack 基础,你都懂了吗?
react hook 初体验»
Flutter 中文教程资源

相关推荐

QR code