Generator 的本质是什么?是否取代了 callback

其实标题中的问题,是一个伪命题,因为Generatorcallback根本没有任何关系,只是我们通过一些方式(而且是很复杂的方式)强行将他俩产生了关系,才会有现在的Generator处理异步。

本节内容概述

  • Generator的本质
  • callback的结合

Generator的本质

介绍Generator第一节中,多次提到 暂停 这个词 ———— “暂停”才是Generator的本质 ———— 只有Generator能让一段程序执行到指定的位置先暂停,然后再启动,再暂停,再启动。

而这个 暂停 就很容易让它和异步操作产生联系,因为我们在处理异步操作时,即需要一种“开始读取文件,然后暂停一下,等着文件读取完了,再干嘛干嘛...”这样的需求。因此将Generator和异步操作联系在一起,并且产生一些比较简明的解决方案,这是顺其自然的事儿,大家要想明白这个道理。

不过,JS 还是 JS,单线程还是单线程,异步还是异步,callback还是callback。这一切都不会因为有一个Generator而有任何变化

码农进阶题库 - 每天一道面试题 or Js小知识@Js中文网

每天弄懂一道面试题(Javascript小知识)来鞭策自己学习思考,每天进步一点,帮助你提高你的代码编写质量

callback的结合

之前在介绍Promise的最后,拿Promisecallback做过一些比较,最后发现Promise其实是利用了callback才能实现的。而这里,Generator也必须利用callback才能实现

拿介绍co时的代码举例(代码如下),如果yield后面用的是thunk函数,那么thunk函数需要的就是一个callback参数。如果yield后面用的是Promise对象,Promisecallback的联系之前已经介绍过了。

co(function* () {
    const r1 = yield readFilePromise('some1.json')
    console.log(r1)  // 打印第 1 个文件内容
    const r2 = yield readFileThunk('some2.json')
    console.log(r2)  // 打印第 2 个文件内容
})

因此,Generator离不开callbackPromise离不开callback,异步也离不开callback

看完两件小事

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

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

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

results matching ""

    No results matching ""