<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Helen Liutongco</title>
    <description>The latest articles on DEV Community by Helen Liutongco (@hliutongco).</description>
    <link>https://dev.to/hliutongco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F142551%2F0abcdcc7-b1d4-48fc-9c54-0cfaf2dc28a9.png</url>
      <title>DEV Community: Helen Liutongco</title>
      <link>https://dev.to/hliutongco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hliutongco"/>
    <language>en</language>
    <item>
      <title>3 React Interview Questions for Junior Devs</title>
      <dc:creator>Helen Liutongco</dc:creator>
      <pubDate>Mon, 03 Jun 2019 15:34:44 +0000</pubDate>
      <link>https://dev.to/hliutongco/3-react-interview-questions-for-junior-devs-chn</link>
      <guid>https://dev.to/hliutongco/3-react-interview-questions-for-junior-devs-chn</guid>
      <description>&lt;p&gt;I was asking some friends about tricky React questions they encountered during their job search and here are a few that stuck out. (Please note that these were all questions for entry-level jobs, so more advanced developers might find these questions less difficult.) Take a minute to guess the answers for yourself before scrolling to see the solutions at the bottom!&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Inside of a class component, if state is initialized outside of the constructor function as well as inside of the constructor, which state object will override the other?
&lt;/h3&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Example extends Component {
   constructor(props){
      super(props)

      this.state = {
         location: "inside constructor"
      }
   }

   state = {
      location: "outside constructor"
   }
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you were to console.log state inside of render, would the value of location be "inside constructor" or "outside constructor"?&lt;/p&gt;

&lt;h3&gt;
  
  
  2) When creating a functional component, why do we still need to import the React library?
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'

const Example = (props) =&amp;gt; {
   return (
      &amp;lt;div&amp;gt;Example&amp;lt;/div&amp;gt;
   )
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Unlike class components, functional components do not extend the Component class from React. So why do we still import the React library?&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Given the following example, in what order will the console.logs run?
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class One extends Component {
   componentDidMount(){
      console.log("One is mounted")
   }

   render(){
      &amp;lt;Two /&amp;gt;
      &amp;lt;Three /&amp;gt;
   }
}

class Two extends Component {
   componentDidMount(){
      console.log("Two is mounted")
   }
}

class Three extends Component {
   componentDidMount(){
      console.log("Three is mounted")
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Take a minute to guess the answers! When you're ready, scroll below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solutions!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Which state object will override the other?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; The state that is initialized inside the constructor will override the state that is initialized outside the constructor. This is because, in terms of how the code compiles, the class will &lt;em&gt;first&lt;/em&gt; initialize all variables and &lt;em&gt;then&lt;/em&gt; run the constructor lifecycle method.&lt;/p&gt;

&lt;p&gt;So concerning this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Example extends Component {
   constructor(props){
      super(props)

      this.state = {
         location: "inside constructor"
      }
   }

   state = {
      location: "outside constructor"
   }
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Inside of render, if we were to use console.log to inspect our state, we would see "inside constructor" as the value of location.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) When creating a functional component, why do we still need to import the React library?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Because we need the React library in order to interpret the JSX that the functional component is returning. After all, JSX is syntactic sugar for the old method of creating objects in the React DOM, i.e. React.createElement(). So even though we are not extending the Component class, we still need the React library in order to create elements on our webpage.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) In what order will the console.logs run?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; The logs will run in this order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Two is mounted"
"Three is mounted"
"One is mounted"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In other words, the parent component is the last one to finish mounting. This is because the children components need to mount before the parent is considered fully mounted.&lt;/p&gt;

&lt;p&gt;If we were to take note of when the components begin to mount and when they finish mounting, it would look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;** One begins mounting **

** Two begins mounting **
// Two finished mounting

** Three begins mounting **
// Three finished mounting

// One finished mounting

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And that's it! If you've run into tricky React questions that aren't on this list, feel free to mention them in the comments.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>interviewprep</category>
    </item>
    <item>
      <title>A Simple(ish) Application of Javascript Generators in React w/ Redux</title>
      <dc:creator>Helen Liutongco</dc:creator>
      <pubDate>Wed, 15 May 2019 20:57:00 +0000</pubDate>
      <link>https://dev.to/hliutongco/a-simple-ish-application-of-javascript-generators-in-react-w-redux-l53</link>
      <guid>https://dev.to/hliutongco/a-simple-ish-application-of-javascript-generators-in-react-w-redux-l53</guid>
      <description>&lt;p&gt;For about a year, I knew &lt;a href="https://medium.com/@liutongcoh/what-the-heck-are-javascript-generator-functions-1eb9d99bd2ea"&gt;what Javascript generators were&lt;/a&gt;, but had no experience using them in the wild. I saw an opportunity to try them out when working on a game called &lt;a href="https://github.com/hliutongco/status-quote-v2-frontend"&gt;Status Quote&lt;/a&gt;, which displays a series of video clips one-by-one.&lt;/p&gt;

&lt;p&gt;This blog post presumes that you understand the basic syntax of a generator function, so if you are new to this topic, please check out &lt;a href="https://medium.com/@liutongcoh/what-the-heck-are-javascript-generator-functions-1eb9d99bd2ea"&gt;my blog post describing the basics of generators&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Goal
&lt;/h2&gt;

&lt;p&gt;The end goal was to use a generator function when iterating through the collection of videos. The ability to pause the function (via the &lt;strong&gt;yield&lt;/strong&gt; keyword) would come in handy for pausing the iteration in order to allow each video to finish playing before moving onto the next video.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;All this code is written inside a component called GameContainer. This component uses the generator function to render an array of VideoPlayer components.&lt;/p&gt;

&lt;p&gt;First, we import an array of objects from a separate file and assign this array to a variable called 'clips'. Each object in the array contains information about a video clip: &lt;code&gt;import {clips} from '../clips'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Second, we save two keys inside of state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  state = {
    counter: 0,
    generatedObj: {value: null}
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The counter will be used to keep track of which element we want to grab inside the array of VideoPlayer components; this number is essentially the index number of the current element in the array.&lt;/li&gt;
&lt;li&gt;The generatedObj key will keep track of the plain object that is returned from the generator object. In other words, this key stores the return value of .next() when it's called on the generator object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will use three lifecycle methods: &lt;strong&gt;componentDidMount, componentDidUpdate, and render&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We will also create two helper methods: one for creating the generator object and another for using the generator object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Generator Object
&lt;/h2&gt;

&lt;p&gt;Let's begin with creating a helper method called 'createVideoGenerator'.&lt;/p&gt;

&lt;p&gt;Inside of this method, the first thing we'll want to create is the array of VideoPlayer components. We map over the 'clips' array in order to create a new array of components: &lt;code&gt;const videoPlayers = clips.map((clip) =&amp;gt; &amp;lt;VideoPlayer key={clip.id} clip={clip}/&amp;gt;)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next is the generator function itself. Let's post the code in its entirety and then break it down line-by-line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  createVideoGenerator = () =&amp;gt; {
    const videoPlayers = clips.map((clip) =&amp;gt; &amp;lt;VideoPlayer key={clip.id} clip={clip}/&amp;gt;)

    function* nextVideo(array){
      while(this.state.counter &amp;lt; array.length) {
        this.setState({ counter: this.state.counter + 1 })
        yield array[this.state.counter]
      }
    }
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let's start with the first line: &lt;code&gt;function* nextVideo(array){&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is simply the function declaration. The generator function is named nextVideo. When we invoke this function later on, the array argument that we pass in will be the videoPlayers array.&lt;/p&gt;

&lt;p&gt;Next: &lt;code&gt;while(this.state.counter &amp;lt; array.length) {&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is where we will use the counter that we are saving in state. If the counter is less than the array's length, this means there are still more VideoPlayer components that need to be rendered to the page.&lt;/p&gt;

&lt;p&gt;Next: &lt;code&gt;this.setState({ counter: this.state.counter + 1 })&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Inside of the while loop, we increment the counter by 1 and then save this new number to state.&lt;/p&gt;

&lt;p&gt;Lastly: &lt;code&gt;yield array[this.state.counter]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Finally, we use the yield keyword to signify when the code should pause. In this case, the code should pause the while loop after returning the current element in the array.&lt;/p&gt;

&lt;h4&gt;
  
  
  // Caveat
&lt;/h4&gt;

&lt;p&gt;You might have noticed something odd about those last two lines of code. After all, setState is asynchronous. This means that in this line of code: &lt;code&gt;yield array[this.state.counter]&lt;/code&gt;, we are not using the updated counter but rather the previous counter before the setState finished running. For instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// this.state.counter =&amp;gt; 0 

this.setState({ counter: this.state.counter + 1 })
// after setState: this.state.counter =&amp;gt; 1

yield array[this.state.counter]
// this.state.counter =&amp;gt; 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This still works because we want to return the array before incrementing the counter. In reality, it would be more accurate if we could reverse the order of those two lines of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yield array[this.state.counter]
this.setState({ counter: this.state.counter + 1 })
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We want to first use the current value of the counter before using setState to increment the counter. Unfortunately, if incrementing through the array causes a re-render, then this will not work. In the case of my application, incrementing through the array causes a change in the Redux state, which causes a re-render in the GameContainer component. This means that any code after yield will never be run.&lt;/p&gt;

&lt;p&gt;My workaround is to take advantage of the asynchronous nature of the setState function. Because it is asynchronous, the yield will always run before the setState is resolved. So in a sense, we are still using setState after the yield. It's a little hack-y, but it works!&lt;/p&gt;

&lt;h4&gt;
  
  
  // End Caveat
&lt;/h4&gt;

&lt;p&gt;The last part of the createVideoGenerator function involves two steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bind the context of the nextVideo generator function&lt;/li&gt;
&lt;li&gt;Invoke the generator function&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside of the nextVideo generator function, when we use the 'this' keyword (e.g. this.state), the value of 'this' needs to be the GameContainer component. Thus we need to use .bind in order to bind the nextVideo function to the context of GameContainer: &lt;code&gt;this.nextVideo = nextVideo.bind(this)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lastly, we invoke the nextVideo function, pass in the videoPlayers array as an argument. This line will also be the return value of the createVideoGenerator function, since a generator function returns a generator object.&lt;/p&gt;

&lt;p&gt;This is the full code for our createVideoGenerator function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  createVideoGenerator = () =&amp;gt; {
    const videoPlayers = clips.map((clip) =&amp;gt; &amp;lt;VideoPlayer key={clip.id} clip={clip}/&amp;gt;)

    function* nextVideo(array){
      while(this.state.counter &amp;lt; array.length) {
        this.setState({ counter: this.state.counter + 1 })
        yield array[this.state.counter]
      }
    }

    this.nextVideo = nextVideo.bind(this)
    return this.nextVideo(videoPlayers)
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Using the Generator Object
&lt;/h2&gt;

&lt;p&gt;Next up, we'll make another helper function that uses the generator object that we created in createVideoGenerator. Let's call this function useGenerator. Here's the code for this function in its entirety:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  useGenerator = () =&amp;gt; {
    this.setState({ generatedObj: this.createVideoGenerator().next() }, () =&amp;gt; {
      if(!this.state.generatedObj.value){
        this.props.handleChange("ENDED")
      }
    })
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After declaring the useGenerator function, we setState using createVideoGenerator as a helper function to access the generator object. Let's take a closer look at the object we're passing as the first argument of setState:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{ generatedObj: this.createVideoGenerator().next() }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;First, we invoke the createVideoGenerator function. The return value is the generator object. Generator objects have access to the function .next, which allows the code inside the generator function to continue running after pausing from the &lt;code&gt;yield&lt;/code&gt; keyword.&lt;/p&gt;

&lt;p&gt;So what's the return value of this whole line of code: &lt;code&gt;this.createVideoGenerator().next()&lt;/code&gt;? It's another plain object! The object might look something like this: &lt;code&gt;{ value: &amp;lt;VideoPlayer/&amp;gt;, done: false }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;As you can see, this object has a key called 'value', which holds the value of whatever we &lt;code&gt;yield&lt;/code&gt;-ed in the generator function. In this case, the value key will hold either one of two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a VideoPlayer component&lt;/li&gt;
&lt;li&gt;null&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value is null when the generator function completely finishes iterating through the videoPlayers array. We then save this object in the generatedObj key in state.&lt;/p&gt;

&lt;p&gt;Let's take a look at the second argument that we're passing to setState:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;() =&amp;gt; {
      if(!this.state.generatedObj.value){
        this.props.handleChange("ENDED")
      }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is a callback that uses the value of the generatedObj in state. If generatedObj is null, we send data to the Redux state. This data essentially signals to other components that we have finished displaying all the videos.&lt;/p&gt;

&lt;p&gt;And that's it! To recap, here is the code for both createVideoGenerator and useGenerator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  createVideoGenerator = () =&amp;gt; {
    const videoPlayers = clips.map((clip) =&amp;gt; &amp;lt;VideoPlayer key={clip.id} clip={clip}/&amp;gt;)

    function* nextVideo(array){
      while(this.state.counter &amp;lt; array.length) {
        this.setState({ counter: this.state.counter + 1 })
        yield array[this.state.counter]
      }
    }

    this.nextVideo = nextVideo.bind(this)
    return this.nextVideo(videoPlayers)
  }

  useGenerator = () =&amp;gt; {
    this.setState({ generatedObj: this.createVideoGenerator().next() }, () =&amp;gt; {
      if(!this.state.generatedObj.value){
        this.props.handleChange("ENDED")
      }
    })
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Using the Helper Methods
&lt;/h2&gt;

&lt;p&gt;Now that we have built out the helper methods, it's time to actually use them! For this part, we will utilize the componentDidMount and componentDidUpdate lifecycle methods.&lt;/p&gt;

&lt;p&gt;The overall idea is to call the userGenerator function both when the component mounts (the very first video) and also whenever there is a change in props that signifies that the next video should be played (every video after the first one).&lt;/p&gt;

&lt;p&gt;This is what the code looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  componentDidMount(){
    this.useGenerator()
  }

  componentDidUpdate(){
    if(this.props.changeNextVideo){
      this.props.toggleChangeNextVideo(false)
      this.useGenerator()
    }
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In componentDidUpdate, changeNextVideo is a boolean that is stored in the Redux state. I set things up so that changeNextVideo toggles to true inside the VideoPlayer component whenever a video ends. Inside the above if statement, it toggles back to false. Finally, we invoke useGenerator() again in order to retrieve the next VideoPlayer component in the videoPlayers array.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Let's recap everything we did:&lt;/p&gt;

&lt;h4&gt;
  
  
  Creating the Generator Object
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  createVideoGenerator = () =&amp;gt; {
    const videoPlayers = clips.map((clip) =&amp;gt; &amp;lt;VideoPlayer key={clip.id} clip={clip}/&amp;gt;)

    function* nextVideo(array){
      while(this.state.counter &amp;lt; array.length) {
        this.setState({ counter: this.state.counter + 1 })
        yield array[this.state.counter]
      }
    }

    this.nextVideo = nextVideo.bind(this)
    return this.nextVideo(videoPlayers)
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We created a helper function called createVideoGenerator. This function contains a generator function inside of it.&lt;/li&gt;
&lt;li&gt;The generator function accepts an array as an argument. It contains a while loop that increments a counter during each iteration and continues running as long as the counter is not greater or equal to the length of the array argument.&lt;/li&gt;
&lt;li&gt;Inside the while loop, we increment the counter and save it to state. Then the generator function &lt;code&gt;yield&lt;/code&gt;s an element of the array, using the counter as an index number.&lt;/li&gt;
&lt;li&gt;Lastly, we bind the context of &lt;code&gt;this&lt;/code&gt; to the GameContainer component and then invoke the generator function, passing the array of VideoPlayer components as the argument.&lt;/li&gt;
&lt;li&gt;The return value of this function is the generator object.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Using the Generator Object
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  useGenerator = () =&amp;gt; {
    this.setState({ generatedObj: this.createVideoGenerator().next() }, () =&amp;gt; {
      if(!this.state.generatedObj.value){
        this.props.handleChange("ENDED")
      }
    })
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We create another helper function in order to retrieve the generator object that is returned in createVideoGenerator.&lt;/li&gt;
&lt;li&gt;We take the generator object and call the .next method, and save the resulting plain object to our state.&lt;/li&gt;
&lt;li&gt;This plain object allows us to access the value that was &lt;code&gt;yield&lt;/code&gt;-ed in the generator function (i.e. a VideoPlayer component). If this value is null, that means we have iterated through the entire videoPlayers array and we can finally end this functionality.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Using the Helper Methods
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  componentDidMount(){
    this.useGenerator()
  }

  componentDidUpdate(){
    if(this.props.changeNextVideo){
      this.props.toggleChangeNextVideo(false)
      this.useGenerator()
    }
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We call the useGenerator function when the component mounts and also whenever the changeNextVideo prop (which is in the Redux state) toggles from false to true.&lt;/li&gt;
&lt;li&gt;This allows the first VideoPlayer component in the videoPlayers array to render right when the GameContainer mounts, and it also allows the rest of the VideoPlayer components to render one after another.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's one application of a generator function in React with Redux! Of course, there are many different (and probably simpler) ways of achieving this same functionality &lt;em&gt;without&lt;/em&gt; using a generator function. This purpose of this little experiment wasn't to write the most efficient code, but rather to satisfy my curiosity for using a generator function inside an actual web app. I hope you're inspired to try using generator functions in your own apps!&lt;/p&gt;

</description>
      <category>react</category>
      <category>redux</category>
      <category>javascript</category>
      <category>es6</category>
    </item>
  </channel>
</rss>
