Learn JavaScript Generators In 12 Minutes

แชร์
ฝัง
  • เผยแพร่เมื่อ 22 ก.ค. 2024
  • JavaScript Simplified Course: javascriptsimplified.com
    Generator functions in JavaScript are a feature most people think is useless, but in reality you can do a lot with generators. In this video I will be covering what generator functions are, how you can use them, and multiple real world examples of where generators are ideal.
    📚 Materials/References:
    JavaScript Simplified Course: javascriptsimplified.com
    Generators Article: blog.webdevsimplified.com/202...
    🌎 Find Me Here:
    My Blog: blog.webdevsimplified.com
    My Courses: courses.webdevsimplified.com
    Patreon: / webdevsimplified
    Twitter: / devsimplified
    Discord: / discord
    GitHub: github.com/WebDevSimplified
    CodePen: codepen.io/WebDevSimplified
    ⏱️ Timestamps:
    00:00 - Introduction
    00:28 - Generator Basics
    05:24 - Generator Use Cases
    09:10 - Generator Advanced Features
    #JavaScriptGenerator #WDS #JavaScript

ความคิดเห็น • 229

  • @olisaac5080
    @olisaac5080 3 ปีที่แล้ว +145

    Generators are useful when it's expensive to do each step of the yield. E.g., if you're hitting an API endpoint on each yield and you don't know how many results users will want, you can delay those API calls until they're actually needed.

    • @siddhantjain2402
      @siddhantjain2402 3 ปีที่แล้ว +28

      I believe you are talking about Pagination?

    • @ShadowVipers
      @ShadowVipers ปีที่แล้ว +2

      Wouldn't this require you to know how many yields to include? Say the number of results varies based on how many results can fit on their screen (auto-loading implementation). Then depending on the height of the screen, one user may only need one api request, another may require 2 requests... so if you have 2 yields wouldn't that block that first user from ever getting their results since the endpoint is still waiting on that second request to occur?

    • @awekeningbro1207
      @awekeningbro1207 ปีที่แล้ว

      Redux saga actually uses generators for async operations

    • @tomjones8293
      @tomjones8293 ปีที่แล้ว +1

      @@awekeningbro1207 saga is dead abandoned project

    • @n8o_
      @n8o_ 28 วันที่ผ่านมา

      It sounds like this is just abstracting away the state needed to accomplish something like pagination

  • @zekumoru
    @zekumoru ปีที่แล้ว +60

    At 8:30, rather than using a for-loop, you can use the _yield*_ keyword because it lets you yield over iterables such as arrays, strings, etc.
    Hence the code at 8:30 can be succinctly written:
    function* generator(array) {
    yield* array;
    }
    Side note: An arrow generator function does not exist.

    • @Exploretheworld-yw7yc
      @Exploretheworld-yw7yc 19 วันที่ผ่านมา

      this works because array also have generator function inside it right ? Like when we do next we ask array to yield and pass that yield back.

    • @zekumoru
      @zekumoru 17 วันที่ผ่านมา

      @@Exploretheworld-yw7yc It doesn't have anything to do with generator functions actually. It has something to do with how the yield* operator works, as the MDN docs state: "The yield* operator is used to delegate to another iterable object, such as a Generator."
      TL;DR: In simple terms, yield* operates on iterables and arrays are iterable objects. And an extra terminology, the objects returned by function generators are called "Generator" objects which are also iterables.
      Notice the word "iterable", what's an iterable? It just basically means that an object, let's name it A , must have the @@iterator method, a.k.a. [Symbol.iterator](), which returns an object (which could be another object B or A itself) that conforms to the iterator protocol. Iterator protocol basically means that an object must have a next() method returning another object C which contains a "value" field, which will be used when next() is called, or a "done" field, indicating that the iteration is finished. Arrays are built-in iterables and that is why we can use the yield* operator on them.
      Here's an example showing an implementation of an iterable object which is then used inside a function generator using the yield* operator:
      const iterableObj = { // This is object A
      [Symbol.iterator]() {
      let i = 0;
      const iteratorObj = { // This is object B
      next() {
      if (i >= 10) return { done: true }; // This is object C
      return { value: i++ }; // Or this is object C
      },
      };
      return iteratorObj;
      },
      };
      const createGenerator = function* () {
      yield* iterableObj;
      };
      const generator = createGenerator();
      for (let result; !(result = generator.next()).done; ) {
      console.log(result.value);
      }

    • @zekumoru
      @zekumoru 17 วันที่ผ่านมา +1

      It doesn't have anything to do with generator functions actually. It has something to do with how the yield* operator works, as the MDN docs state: "The yield* operator is used to delegate to another iterable object, such as a Generator."
      TL;DR: In simple terms, yield* operates on iterables and arrays are iterable objects. Also, "Generator" are the objects returned by function generators.
      Notice the word "iterable", what's an iterable? It just basically means that an object, let's name it A, must have the @@iterator method, a.k.a. [Symbol.iterator](), which returns an object (which could be another object B or A itself) that conforms to the iterator protocol. Iterator protocol basically means that an object must have a next() method returning another object C which contains a "value" field, which will be used when next() is called, or a "done" field, indicating that the iteration is finished. Arrays are built-in iterables and that is why we can use the yield* operator on them.
      Here's an example showing an implementation of an iterable object which is then used inside a function generator using the yield* operator:
      const iterableObj = { // This is object A
      [Symbol.iterator]() {
      let i = 0;
      const iteratorObj = { // This is object B
      next() {
      if (i >= 10) return { done: true }; // This is object C
      return { value: i++ }; // Or this is object C
      },
      };
      return iteratorObj;
      },
      };
      const createGenerator = function* () {
      yield* iterableObj;
      };
      const generator = createGenerator();
      for (let result; !(result = generator.next()).done; ) {
      console.log(result.value);
      }
      Therefore no, arrays don't have a generator function inside them. It's because arrays are iterables and yield* operates on iterables.

  • @ukaszzbrozek6470
    @ukaszzbrozek6470 3 ปีที่แล้ว +215

    I personally never had a need to use a generator in JS. Still interesting content .

    • @richardkirigaya8254
      @richardkirigaya8254 3 ปีที่แล้ว +20

      wait until you start using redux saga :)

    • @ukaszzbrozek6470
      @ukaszzbrozek6470 3 ปีที่แล้ว +5

      @@richardkirigaya8254 I used to work with redux saga a long time ago. I now that it have generators under the hood. I wrote some generators for testing sagas.
      Thanks fo jogging my memory :)

    • @richardkirigaya8254
      @richardkirigaya8254 3 ปีที่แล้ว +4

      @@ukaszzbrozek6470 Personally, out of everything in React, the only thing that gives me headache till today is redux saga

    • @Endrit719
      @Endrit719 3 ปีที่แล้ว +3

      @@richardkirigaya8254 why is it necessary to use redux saga tho?

    • @richardkirigaya8254
      @richardkirigaya8254 3 ปีที่แล้ว +1

      @@Endrit719 it's not really necessary to use, it's more of a preferred option than Thunk. Sagas are preferred over Thunk cos of "callback hell" + it's easier to test your async code with Saga over Thunk

  • @azizgofurov1575
    @azizgofurov1575 3 ปีที่แล้ว +10

    Just on Tuesday, I had an interview, and the interviewer asked me about generators. Unfortunately, I forgot about them, but passed the interview. Great stuff to revise, thanks!)

  • @VivekMore1
    @VivekMore1 3 ปีที่แล้ว +58

    Very interesting tutorial. 👍🏻👍🏻
    I think at 8:05 it should have been
    while (object.next().done === false)
    Or simply
    while (!object.next().done)

  • @kashifwahaj
    @kashifwahaj 2 ปีที่แล้ว +2

    this is exactly what i am looking for ..I once saw this in redux saga but never truly understood how they work and proper use case..
    but you explained it very simply and help to find use case and wow just clicked in mind that I need exactly something like this

  • @nativeKar
    @nativeKar 3 ปีที่แล้ว

    I've been DYING for you to make EXACTLY this! Thanks!

  • @b7otato
    @b7otato 2 ปีที่แล้ว

    As usual, great and simple explaination. Thank you

  • @dennis87ist
    @dennis87ist 2 ปีที่แล้ว

    Very clear! Thank you so much man!

  • @amilww
    @amilww 3 ปีที่แล้ว

    I happened to see it with React's Redux, But only now have I got to know real use cases. Thanks a lot for useful info

  • @boiimcfacto2364
    @boiimcfacto2364 3 ปีที่แล้ว +3

    Incredible video as always, can't wait to see you reach 750K soon! :)

  • @maximvoloshin7602
    @maximvoloshin7602 3 ปีที่แล้ว +3

    You can make a separate video comparing generators to the components from popular JS frameworks. All of them are of the same nature - a function with an internal state.

  • @explore-learn-share6937
    @explore-learn-share6937 2 ปีที่แล้ว

    Very well explained. Thank you making such useful and informative videos

  • @simonadams4857
    @simonadams4857 2 ปีที่แล้ว +1

    Thank you sir, your contents are always helpful. Keep the good work, well done

  • @bas_kar_na_yar
    @bas_kar_na_yar 3 ปีที่แล้ว +1

    This might come handy in creating something like a mock API for testing your system or as a placeholder.

  • @singularity1130
    @singularity1130 2 ปีที่แล้ว +3

    I feel like it's best used for large scale applications with many interdependent systems waiting on a signal to continue to their next step in an infinite or very long cycle. This seems like a niche but very powerful tool that can't be easily replaced and I'm sad I can't figure out any other common use cases that map/acc already don't fill since it looks fun to implement.

  • @dan110024
    @dan110024 2 ปีที่แล้ว

    A single take, to the point, nails the explination in an understandable way. Are you actually a robot? Your content is always the go-to when I'm having trouble with a pluralsight module.

  • @wawayltd
    @wawayltd ปีที่แล้ว

    Kyle saves the day again! Thank You!... Just trying to get into Redux-Saga, so that was really helpful.👍

  • @rodrigomatiasdesouza845
    @rodrigomatiasdesouza845 ปีที่แล้ว

    Thanks so much for the video. It's really good.

  • @joel_mathew
    @joel_mathew 3 ปีที่แล้ว +3

    I love ur videos it really helps Thank u so much for these tutorials

  • @cyril7104
    @cyril7104 3 ปีที่แล้ว

    Thx for video, explanation for fancy Reflect would be amazingly usefull :)

  • @bineetnaidu5146
    @bineetnaidu5146 3 ปีที่แล้ว +3

    Interesting... I learned something new today.

  • @DaveGalligher
    @DaveGalligher 2 ปีที่แล้ว

    Great explanation, thank you.

  • @Guihgo
    @Guihgo 2 ปีที่แล้ว

    Tks só much! Best tutorial

  • @rei.orozco
    @rei.orozco 2 ปีที่แล้ว

    Thanks a lot, very clear explanation

  • @geneanthony3421
    @geneanthony3421 2 ปีที่แล้ว

    I first heard about generators in Python and the concept seems quite nice (although haven't done much Python since to use them yet). Should allow for less resources tied up at once and cleaner code since you don't need to call a function from a function (since it just returns the latest result to whatever called it who can then do what it wants with it).

  • @mthaha2735
    @mthaha2735 3 ปีที่แล้ว +40

    I have used generator in a situation where I wanted to merge two arrays and do some mapping action on it. Generally you would need an extra variable to hold the result and pass it to the caller. But with generator you don't have to. Yield the line where this transformation happens and where it is called you can do a array.from

    • @sortirus
      @sortirus 3 ปีที่แล้ว +19

      Could you provide an example? Because I normally would use spread syntax to merge two arrays and then map them in your example.

    • @mraravind1111
      @mraravind1111 3 ปีที่แล้ว

      @@sortirus Yeah I use both spread and concat

    • @stcm
      @stcm 3 ปีที่แล้ว

      @@sortirus In this context I think they are using a zipper merge where each element of the final array is some combination of the elements of the same index in the original arrays. (e.g. outArr[i] = {...inArrA[i], ...inArrB[i]} - although the object could be more complex than that) This would allow you to do multiple operations on that object before setting it's value in the final array (kind of like arrA.zip(arrB).map().map().map()). It's not a perfect analogy but hopefully gets the point across.

  • @ImmortalBest
    @ImmortalBest 3 ปีที่แล้ว +4

    after C# with those IEnumerable, IEnumerator and yield which under the hood creates its own enumerator this is so easy )

  • @kushagragarg4370
    @kushagragarg4370 2 ปีที่แล้ว

    Thanks, It really helped a lot.

  • @Ballistic_Bytes
    @Ballistic_Bytes 2 ปีที่แล้ว

    Brilliant explaination

  • @imaaduddin7715
    @imaaduddin7715 3 ปีที่แล้ว

    Great video! Appreciate it!

  • @Krzysiekoy
    @Krzysiekoy 3 ปีที่แล้ว +15

    I've used generators some time ago. Mainly for learning purposes. Some Use cases for me were (mainly implementing Symbol.iterator so that I can use for of loop and rest operator):
    1. If you want your object to have a working iterator, so that you can use for of loop in your object. Example:
    const company = {
    employees: ["kat", "manuel", "kris"],
    [Symbol.iterator]: function* employeeGenerator() {
    let curEmp = 0;
    while (curEmp < this.employees.length) {
    yield this.employees[curEmp];
    curEmp += 1;
    }
    for (const emp of company) {
    console.log(emp); // "kat", "manuel", "kris"
    }
    2. You can also use a spread operator if you implement symbol.iterator with a generator function.
    const someIterable = {};
    someIterable[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
    };
    console.log([...someIterable]); // you can spread the object like this
    3. You can also parametrize your generator function and, for example, iterate over your iterable with some phrase:
    function* countFruit(phrase) {
    const fruits = ["apple", "banana", "peach"];
    let curIndex = 0;
    while (curIndex < fruits.length) {
    yield phrase + fruits[curIndex];
    curIndex += 1;
    }
    }
    const fruitIterator = countFruit("A nice: ");
    console.log(fruitIterator.next()); // A nice apple...
    console.log(fruitIterator.next()); // A nice banana...
    console.log(fruitIterator.next()); // A nice peach...

    • @shivanshpratap3624
      @shivanshpratap3624 3 ปีที่แล้ว

      So, in the first example here, What is the difference if we use map function to loop over the employees array and by iterating it by using a generator. Please explain

  • @rezaghaemifar5703
    @rezaghaemifar5703 ปีที่แล้ว

    What a perfect explanation

  • @sanketwakhare27
    @sanketwakhare27 2 ปีที่แล้ว

    Great video. Thanks!

  • @korzinko
    @korzinko 3 ปีที่แล้ว +29

    I found only 3 useful use cases for generators:
    - iterators
    - multiple returns from function (events, progress ...)
    - chunk huge workload over multiple animation frames

    • @AjithKumar-te4fp
      @AjithKumar-te4fp 10 หลายเดือนก่อน

      Hey @korzinko i have one question to you. if multiple returns. why can't we use conditional statements? please clear this.

    • @korzinko
      @korzinko 10 หลายเดือนก่อน

      @@AjithKumar-te4fp convenience and cleaner code.
      If you have a code, that can produce multiple values over the time, e.g. long running task with progress (storing 1000+ rows in DB, upload of large file...) or lazy evaluation(expensive DOM traversal), it's convenient to hide it inside the generator.
      Without it, you would either polute global scope with variables or reinvent the same logic in object/class/closure.
      Generators are not something you will not use daily , but occasionally they are handy.

    • @AjithKumar-te4fp
      @AjithKumar-te4fp 10 หลายเดือนก่อน

      @@korzinko 👍 agreed

  • @khalednasr7952
    @khalednasr7952 3 ปีที่แล้ว

    Good video as always!

  • @yoscbd
    @yoscbd 2 ปีที่แล้ว

    Great content! :)

  • @erikawwad7653
    @erikawwad7653 3 ปีที่แล้ว

    got to use this at work and it just fit the solution

  • @erfelipe
    @erfelipe 3 ปีที่แล้ว

    Great explanation.

  • @surya-saran
    @surya-saran 3 ปีที่แล้ว

    Hello Kyle, can we have a video in how to create a custom debugger for javascript ?, That'll be more interesting... ✌🏼
    And also love your content ❤️

  • @thanveerahmed1963
    @thanveerahmed1963 หลายเดือนก่อน

    Seriously Awesome content

  • @johncerpa3782
    @johncerpa3782 3 ปีที่แล้ว

    Good explanation 👍🏼

  • @jasonhuang4333
    @jasonhuang4333 2 ปีที่แล้ว

    Kyle you are the best!

  • @gabrielmachado5708
    @gabrielmachado5708 3 ปีที่แล้ว +30

    Oh, you didn't talk about the coolest part that is you can loop through the generator values with a for loop and collect the values with the spread operator

    • @erikawwad7653
      @erikawwad7653 3 ปีที่แล้ว +3

      Used this at work! felt like a badass

    • @rahulxdd
      @rahulxdd 3 ปีที่แล้ว +3

      @@erikawwad7653 @Gabriel Machado Can I see an example please?

    • @Hendika
      @Hendika 3 ปีที่แล้ว +2

      Example code would be very helpful :D

    • @Yous0147
      @Yous0147 3 ปีที่แล้ว +1

      So if I'm understanding correctly, what you can do is define a generator to do whatever calculations you want and then collect each value in a for loop? So like:
      function* geometricGenerator(){
      let num = 1;
      while(true){
      yield num
      num*2
      }
      }
      const geometricList = [];
      const generator = geometricGenerator();
      for(var i = 0; i < 10; i++){
      geometricList.push(generator.next());
      }
      I am not sure how to do this with the spread operator though

    • @Italiafani
      @Italiafani 3 ปีที่แล้ว +9

      ​@@Hendika
      // Generator function with an exit condition
      function* myGenFun () {
      let i = 0
      while (i < 5) yield i++
      }
      // Spread
      const myArr = [...myGenFun()]
      // or
      console.log(...myGenFun())
      // Use in a for loop
      for (const i of myGenFun()) console.log(i)
      // Your program will obviously run out of memory if you try to
      // use the spread operator with a generator function where
      // there's no exit condition. Same goes for the for loop, unless
      // of course you break out of the loop yourself, like so:
      function* powers (n) {
      for (let current = n;; current *= n) {
      yield current
      }
      }
      for (const power of powers(2)) {
      if (power > 32) break
      console.log(power) // 2, 4, 8, 16, 32
      }

  • @BartBruh
    @BartBruh ปีที่แล้ว

    You are amazing bro!

  • @ryzs_
    @ryzs_ 3 ปีที่แล้ว

    After many youtube videos I watch explaining about generator, this one most accurate! Finally i can move on 😂

  • @aydzz
    @aydzz 14 วันที่ผ่านมา

    Thanks Kylee!

  • @jsmunroe
    @jsmunroe 3 หลายเดือนก่อน

    This is the heart and soul of LINQ and delayed execution. I need to write a LINQ-like package. That would be so much fun!

  • @balazsgyekiczki1140
    @balazsgyekiczki1140 3 ปีที่แล้ว

    Very nice!

  • @whoseinm
    @whoseinm 3 ปีที่แล้ว

    your channel is the best bro

  • @anbor7778
    @anbor7778 3 ปีที่แล้ว

    i don't know why this channel is not growing😕
    man, good work
    really appreciate

    • @GbpsGbps-vn3jy
      @GbpsGbps-vn3jy 3 ปีที่แล้ว

      Because these days JS yield too many features that are pointless to use in general purpose front/end coding

  • @subinkv6849
    @subinkv6849 4 หลายเดือนก่อน

    Great content..

  • @Norfeldt
    @Norfeldt 3 ปีที่แล้ว +1

    To make it more obvious (to me) that yield can do two operations (return a value and insert a value via .next) would be like "const increment = yield id || 1; id += increment"
    Great video. 👌👍👏

    • @vukkulvar9769
      @vukkulvar9769 3 ปีที่แล้ว

      You could confuse (yield id) || 1 and yield (id || 1)

  • @Nick12_45
    @Nick12_45 3 หลายเดือนก่อน +1

    Thanks!

  • @bhaveshverma8629
    @bhaveshverma8629 3 ปีที่แล้ว

    Very good tutorial

  • @abdellahcodes
    @abdellahcodes 2 ปีที่แล้ว

    For the example array, you could simply `yield* arr` or any other iterable for that matter l, including other generators

  • @moiserwibutso4899
    @moiserwibutso4899 2 ปีที่แล้ว

    Thanks a lot.

  • @Petriu1
    @Petriu1 2 ปีที่แล้ว

    A cool use for these would be to return different class names or other animation/styling behaviours, where excessive code is not needed. Simple just yield return another class when clicked on something.

  • @danial668
    @danial668 3 ปีที่แล้ว

    Nice explanation

  • @adnan19672000
    @adnan19672000 ปีที่แล้ว +1

    HI, I'm following your videos lately, and I liked them a lot. I wonder if you can make a new video about "generator composition" because its idea is not very clear to me. Thank you.

  • @mishasawangwan6652
    @mishasawangwan6652 3 ปีที่แล้ว

    just a nitpit suggestion: if you turn up the ‘release’ parameter on your gate, the vocal audio would sound much smoother.

  • @Kanexxable
    @Kanexxable 3 ปีที่แล้ว

    I want to make a blog site eventually and use a CMS to manage the site which one do i pick contentful strapi or ghost which is the best one

  • @7billon680
    @7billon680 3 ปีที่แล้ว

    Lovely content❤️❤️❤️❤️❤️

  • @arunprakash9736
    @arunprakash9736 3 ปีที่แล้ว

    It would be useful if you do a video on co npm module. I saw thatused in many places, but it is hard to understand

  • @camotubi
    @camotubi 3 ปีที่แล้ว +3

    Is there any difference between creating a generator function and creating an object that implements the iterator protocol? Or is it like async await and .then, .catch that they are syntactically different but allow you to do the same thing?

    • @nathanielnizard2163
      @nathanielnizard2163 3 ปีที่แล้ว

      iterator Symbol plz. I think the best thing to do is to promise chain them because generators have already a throw feature when things go wrong, it is meant to be "plugged" this way I think.

  • @milankbudha
    @milankbudha 3 ปีที่แล้ว

    thank u so much

  • @miw879
    @miw879 2 ปีที่แล้ว

    SIR THANK YOU FOR EXISTING

  • @ChrisAthanas
    @ChrisAthanas 3 ปีที่แล้ว

    The best tutorials

  • @cw3dv
    @cw3dv 3 ปีที่แล้ว

    Awesome video!
    but there is some problem with your microphone or the controller IG

  • @alphacubeastraja
    @alphacubeastraja 3 ปีที่แล้ว

    Great content, one question though, why you don't use semicolons? Lack of semicolons would work in all js scripts?

  • @kurtstephens9409
    @kurtstephens9409 3 ปีที่แล้ว +2

    JavaScript also includes the yield* keyword which allows recursive generator functions. I've used this before with graph traversal. Here is an example of a simple binary tree class with a recursive preorder generator:
    class TreeNode {
    constructor(value) {
    this.value = value
    this.left = null
    this.right = null
    }

    *preorder() {
    if (this.left !== null) {
    yield* this.left.preorder()
    }

    yield this.value

    if (this.right !== null) {
    yield* this.right.preorder()
    }
    }
    }
    const root = new TreeNode(4)
    root.left = new TreeNode(2)
    root.left.left = new TreeNode(1)
    root.left.right = new TreeNode(3)
    root.right = new TreeNode(6)
    root.right.left = new TreeNode(5)
    root.right.right = new TreeNode(7)
    console.log(...root.preorder())

  • @rajatsawarkar
    @rajatsawarkar 3 ปีที่แล้ว +9

    using it for frontend pagination could be an option actually

  • @dhawalparmar7117
    @dhawalparmar7117 2 ปีที่แล้ว

    Best youtube channel for Js

  • @nhantrong7395
    @nhantrong7395 3 ปีที่แล้ว

    Thanks bro

  • @ashoksoni8931
    @ashoksoni8931 2 ปีที่แล้ว +1

    at 10:17 how do we go below our line of code then back above to yield the new id ?

  • @mtranchi
    @mtranchi 3 ปีที่แล้ว +7

    So I can see the value with generating id's and with iterating over arrays. Any other real-world use cases? I'm asking because offhand I can't think of any.

    • @meganadams7274
      @meganadams7274 3 ปีที่แล้ว +1

      I was thinking what about using it to click through frames, like in a slideshow or something?

    • @manit77
      @manit77 2 ปีที่แล้ว +2

      Old code, you don't need it anymore.

  • @sh4kirrr448
    @sh4kirrr448 3 ปีที่แล้ว

    Could you please make a video on Symbol.asyncIterator and how they are useful?

  • @akifcankara2225
    @akifcankara2225 2 ปีที่แล้ว

    i think we can use generators also for submiting form. First validate the input fields after call next and send request to api

  • @yahyeabdirashid9716
    @yahyeabdirashid9716 3 ปีที่แล้ว

    Thanks

  • @mahmoudzakria6946
    @mahmoudzakria6946 3 หลายเดือนก่อน

    I think it has a lot of benefits for example if you want to create multiple steps bar component that contains step 1, step 2, ...etc

  • @ttbooster
    @ttbooster 3 ปีที่แล้ว

    Is this only aplicable for JS or is it possible in TypeScript as well, say Angular? What would the syntax be?

  • @bazy1983
    @bazy1983 3 ปีที่แล้ว

    Can this replace recursive function call?

  • @TECPABLO
    @TECPABLO 2 ปีที่แล้ว

    very good

  • @yashojha5033
    @yashojha5033 3 ปีที่แล้ว

    Awesome. Thanks. But I didn't understand at 10:33 how passing a value to yield affected the response of the same iteration.

    • @vukkulvar9769
      @vukkulvar9769 3 ปีที่แล้ว

      the previous yield provides the argument, loop through, the current yield return the updated value using the argument
      first loop
      yield 1
      second loop
      const increment = 4
      yield 5

  • @petarkolev6928
    @petarkolev6928 2 ปีที่แล้ว

    Amazing explanation! But I am confused why do we need not to do strict comparison? I mean the code from the video works fine (I am talking about the generateId() example) but when I write it down with a strict comparison, e.g. increment !== null I yield only 1 and the rest is undefined and done. Why is that?

  • @Larpus
    @Larpus 3 ปีที่แล้ว +1

    So, basically what Tim Corey said on his video few days ago about Yield in C#

  • @JasimGamer
    @JasimGamer 3 ปีที่แล้ว

    You can also
    function* gen(){
    yield......
    }
    let g = gen()
    arr = [...g]
    console.log(arr)
    or
    console.log([...g)

  • @AnkurShah_CS
    @AnkurShah_CS 2 ปีที่แล้ว

    Should we use it in backend for creating id's ?? Any pros/cons ??

  • @alexanderhorl6602
    @alexanderhorl6602 2 ปีที่แล้ว

    The infinite loop like you showed it could be written as a closure instead of a generator too, right?

  • @plsreleasethekraken
    @plsreleasethekraken ปีที่แล้ว +1

    At 7:30, unfortunately when you express Object.next() to check the done property, you're releasing the value and won't have access to it again inside the while loop without some assignment.

  • @filenko45
    @filenko45 3 ปีที่แล้ว

    Make a video about symbol type in JS please 🙏

  • @antwanwimberly1729
    @antwanwimberly1729 8 หลายเดือนก่อน

    ECMA needs a more universal standard . We’re working on it but thanks babel for getting up ahead

  • @mohammedpapad2202
    @mohammedpapad2202 3 ปีที่แล้ว

    Nice

  • @alii4334
    @alii4334 3 ปีที่แล้ว

    Will that be useful for infinite scrolling?

  • @shaik_mohammedimran
    @shaik_mohammedimran 3 ปีที่แล้ว

    Nice, What is prototype in JS

  • @RawMilkEnthusiast
    @RawMilkEnthusiast 3 ปีที่แล้ว

    So when you’re passing a number to next(), you don’t need to add parameters to the generator function for it to take that number as an argument?

    • @ygormartinsr
      @ygormartinsr 3 ปีที่แล้ว

      Only if he had manually declared next()

  • @mynameiskranz
    @mynameiskranz 2 ปีที่แล้ว

    this reminds me of how the expressjs middleware works

  • @artgreg2296
    @artgreg2296 3 ปีที่แล้ว

    Thanks mr Kyle (i dont know if you noticed each time my comments on your vid) but this time you did not cover "yield delegation" neither async generator...

  • @EmptyGlass99
    @EmptyGlass99 2 ปีที่แล้ว

    exactly the same as 'yield return' in C# which creates an object of type IEnumerable

  • @pranavbhat29
    @pranavbhat29 2 ปีที่แล้ว

    8:07,Isn't it while(object.next().done === false )?