• 丁鹿学堂:js进阶之异步解决方案:generator迭代器


    协程

    协程是一种基于线程之上,但又比线程更加轻量级的存在。对内核来说具有不可见性。

    一个进程可以有多个线程。一个线程可以有多个协程。

    generator函数

    generator就是生成器函数。是协程在es6中的一个实现。它最大的特征就是可以交出函数的执行权。

    generator函数的执行和传统的不一样,它的返回值是一个迭代器对象。

    简单理解就是返回值是一个对象,有两个属性,一个是value,一个是done,vlaue就是返回的值,done就是是不是可以继续迭代。

    generator的写法:

    1.generator相对于普通函数在function后面多加了*号

    2.在每个我们需要中断执行的语句前加了yield,通过yield来控制函数执行。也就是说他的返回值每次调用next只会执行第一个yield后面的代码,如果需要继续执行,需要调用返回的迭代器的next方法

    如果没有yield了,会返回{value: undefined, done:true}

    1. function* funG() {
    2. yield console.log(1)
    3. yield console.log(2)
    4. yield console.log(3)
    5. }
    6. const result = funG()
    7. result.next() // 1
    8. result.next() // 2

    通过自动执行器去自动执行generator解决异步问题

    所谓的自动执行,其实就是利用迭代器的每次next都会指向下一个迭代对象。

    如果done 为true则表示没有下一个了。

    所以我们利用判断done+递归,实现generator的自动执行。

    1. function* gen(){
    2. let url = 'xxxxx'
    3. let result = yield fetch(url) // fetch假设是一个ajax请求,返回的是一个promise对象
    4. console.log(result.value)
    5. }
    6. let g = gen() // g 是一个可迭代对象
    7. let result = g.next()
    8. // 自动执行函数
    9. function run (gen){
    10. let g = gen()
    11. function next(data){
    12. let result = g.next()
    13. if(result.done){
    14. return result.value
    15. }
    16. result.value.then(function(){
    17. return data.json()
    18. }).then(function(data){
    19. next(data)
    20. })
    21. }
    22. next()
    23. }
    24. run(gen)

    总结:

    其实generator在我们实际开发中比较不常见,因为他本身当时主要用于js 的异步解决方案,但是后来被更好的async await替代了,async await也是js异步的终极解决方案。但是generator独特的特性可以让我们在函数执行的过程中传递参数获取结果,使得函数调用变得更加灵活。

    我们了解一下,对我们以后阅读源码,进阶都是很有帮助的,面试的时候除了async -await 之前再聊一聊generator也是加分项!

  • 相关阅读:
    【2022】计算机视觉算法岗面试题目和复习知识点汇总
    SSL单向认证原理
    springboot异步操作之Async
    [项目管理-1]:软硬件项目管理 - 总体概述、框架、实践活动、常见工具、软件研发过程、软件开发周期模型
    Hexagon_V65_Programmers_Reference_Manual(19)
    面向面试编程:分布式ID生成策略(二)
    DRM全解析 —— CRTC详解(4)
    【深度学习】ONNX模型多线程快速部署【基础】
    uniapp读取(获取)缓存中的对象值(微信小程序)
    【问题解决】新版webots纹理等资源文件加载/下载时间过长
  • 原文地址:https://blog.csdn.net/qq_38525381/article/details/127580352