Idomatic way to ignore `finally` block after cancelling network request Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?

retrieve food groups from food item list

After Sam didn't return home in the end, were he and Al still friends?

What does Turing mean by this statement?

How to force a browser when connecting to a specific domain to be https only using only the client machine?

What does it mean that physics no longer uses mechanical models to describe phenomena?

How many time has Arya actually used Needle?

Relating to the President and obstruction, were Mueller's conclusions preordained?

Differences to CCompactSize and CVarInt

Central Vacuuming: Is it worth it, and how does it compare to normal vacuuming?

How does the math work when buying airline miles?

Asymptotics question

Would color changing eyes affect vision?

Understanding p-Values using an example

two integers one line calculator

Tannaka duality for semisimple groups

Why are vacuum tubes still used in amateur radios?

How can a team of shapeshifters communicate?

Why weren't discrete x86 CPUs ever used in game hardware?

GDP with Intermediate Production

License to disallow distribution in closed source software, but allow exceptions made by owner?

How to ternary Plot3D a function

Flight departed from the gate 5 min before scheduled departure time. Refund options

Can you force honesty by using the Speak with Dead and Zone of Truth spells together?

Moving a wrapfig vertically to encroach partially on a subsection title



Idomatic way to ignore `finally` block after cancelling network request



Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








1












$begingroup$


In React, it is quite common for me to have something similar to the following.



async componentDidMount() 
try
this.setState( isLoading: true )
const data = await axios.get('...')
this.setState( data )
catch(error)
handleError(error)
finally
this.setState( isLoading: false )




This is great because the cleanup code (isLoading: false) is DRY. That is, until I try to cancel network requests on unmount. That code would look like this:



async componentDidMount() 
try
this.axiosCancelTokenSource = axios.CancelToken.source()
this.setState( isLoading: true )
const data = await axios.get('...',
cancelToken: this.axiosCancelTokenSource.token,
)
this.setState( data )
catch(error)
if (axios.isCancel(error)) return
handleError(error)
finally
this.setState( isLoading: false )


componentWillUnmount()
if (this.axiosCancelTokenSource) this.axiosCancelTokenSource()



The problem with this is that it will setState after the component unmounts, which React will warn againts.



As far as I see it, these are my options for dealing with this:



  1. Ignore the warning.
    React gives a warning when you setState after unmount because it indicates a memory leak (in this case, the lingering network request, if not cancelled). If the network request is cancelled, there is still a setState after unmount, but just to set a flag. There is no more lingering network request. It should be safe to ignore the warning in this case, but it doesn't feel right.


  2. Check what error was thrown in the finally block and add the same if statement as the catch block. This seems incredibly hacky and would require extra code to save the error from the catch block.


  3. Check if the component is mounted in the finally block. This is also hacky and requires boilerplate code to update a this.isMounted flag.


  4. Put the cleanup code at the end of try and after the condition in catch. This is not DRY. Humans are also very forgetful; I cannot count how many times I have forgotten to set isLoading = false in catch.


  5. Define a cleanup() function before the try and call it in try and catch. This is a decent option, but requires extra function calls, making it harder to follow.


So far, it looks like the first or fifth options are best, depending on how much you care about seeing warning messages. Am I missing any good options?









share









$endgroup$


















    1












    $begingroup$


    In React, it is quite common for me to have something similar to the following.



    async componentDidMount() 
    try
    this.setState( isLoading: true )
    const data = await axios.get('...')
    this.setState( data )
    catch(error)
    handleError(error)
    finally
    this.setState( isLoading: false )




    This is great because the cleanup code (isLoading: false) is DRY. That is, until I try to cancel network requests on unmount. That code would look like this:



    async componentDidMount() 
    try
    this.axiosCancelTokenSource = axios.CancelToken.source()
    this.setState( isLoading: true )
    const data = await axios.get('...',
    cancelToken: this.axiosCancelTokenSource.token,
    )
    this.setState( data )
    catch(error)
    if (axios.isCancel(error)) return
    handleError(error)
    finally
    this.setState( isLoading: false )


    componentWillUnmount()
    if (this.axiosCancelTokenSource) this.axiosCancelTokenSource()



    The problem with this is that it will setState after the component unmounts, which React will warn againts.



    As far as I see it, these are my options for dealing with this:



    1. Ignore the warning.
      React gives a warning when you setState after unmount because it indicates a memory leak (in this case, the lingering network request, if not cancelled). If the network request is cancelled, there is still a setState after unmount, but just to set a flag. There is no more lingering network request. It should be safe to ignore the warning in this case, but it doesn't feel right.


    2. Check what error was thrown in the finally block and add the same if statement as the catch block. This seems incredibly hacky and would require extra code to save the error from the catch block.


    3. Check if the component is mounted in the finally block. This is also hacky and requires boilerplate code to update a this.isMounted flag.


    4. Put the cleanup code at the end of try and after the condition in catch. This is not DRY. Humans are also very forgetful; I cannot count how many times I have forgotten to set isLoading = false in catch.


    5. Define a cleanup() function before the try and call it in try and catch. This is a decent option, but requires extra function calls, making it harder to follow.


    So far, it looks like the first or fifth options are best, depending on how much you care about seeing warning messages. Am I missing any good options?









    share









    $endgroup$














      1












      1








      1





      $begingroup$


      In React, it is quite common for me to have something similar to the following.



      async componentDidMount() 
      try
      this.setState( isLoading: true )
      const data = await axios.get('...')
      this.setState( data )
      catch(error)
      handleError(error)
      finally
      this.setState( isLoading: false )




      This is great because the cleanup code (isLoading: false) is DRY. That is, until I try to cancel network requests on unmount. That code would look like this:



      async componentDidMount() 
      try
      this.axiosCancelTokenSource = axios.CancelToken.source()
      this.setState( isLoading: true )
      const data = await axios.get('...',
      cancelToken: this.axiosCancelTokenSource.token,
      )
      this.setState( data )
      catch(error)
      if (axios.isCancel(error)) return
      handleError(error)
      finally
      this.setState( isLoading: false )


      componentWillUnmount()
      if (this.axiosCancelTokenSource) this.axiosCancelTokenSource()



      The problem with this is that it will setState after the component unmounts, which React will warn againts.



      As far as I see it, these are my options for dealing with this:



      1. Ignore the warning.
        React gives a warning when you setState after unmount because it indicates a memory leak (in this case, the lingering network request, if not cancelled). If the network request is cancelled, there is still a setState after unmount, but just to set a flag. There is no more lingering network request. It should be safe to ignore the warning in this case, but it doesn't feel right.


      2. Check what error was thrown in the finally block and add the same if statement as the catch block. This seems incredibly hacky and would require extra code to save the error from the catch block.


      3. Check if the component is mounted in the finally block. This is also hacky and requires boilerplate code to update a this.isMounted flag.


      4. Put the cleanup code at the end of try and after the condition in catch. This is not DRY. Humans are also very forgetful; I cannot count how many times I have forgotten to set isLoading = false in catch.


      5. Define a cleanup() function before the try and call it in try and catch. This is a decent option, but requires extra function calls, making it harder to follow.


      So far, it looks like the first or fifth options are best, depending on how much you care about seeing warning messages. Am I missing any good options?









      share









      $endgroup$




      In React, it is quite common for me to have something similar to the following.



      async componentDidMount() 
      try
      this.setState( isLoading: true )
      const data = await axios.get('...')
      this.setState( data )
      catch(error)
      handleError(error)
      finally
      this.setState( isLoading: false )




      This is great because the cleanup code (isLoading: false) is DRY. That is, until I try to cancel network requests on unmount. That code would look like this:



      async componentDidMount() 
      try
      this.axiosCancelTokenSource = axios.CancelToken.source()
      this.setState( isLoading: true )
      const data = await axios.get('...',
      cancelToken: this.axiosCancelTokenSource.token,
      )
      this.setState( data )
      catch(error)
      if (axios.isCancel(error)) return
      handleError(error)
      finally
      this.setState( isLoading: false )


      componentWillUnmount()
      if (this.axiosCancelTokenSource) this.axiosCancelTokenSource()



      The problem with this is that it will setState after the component unmounts, which React will warn againts.



      As far as I see it, these are my options for dealing with this:



      1. Ignore the warning.
        React gives a warning when you setState after unmount because it indicates a memory leak (in this case, the lingering network request, if not cancelled). If the network request is cancelled, there is still a setState after unmount, but just to set a flag. There is no more lingering network request. It should be safe to ignore the warning in this case, but it doesn't feel right.


      2. Check what error was thrown in the finally block and add the same if statement as the catch block. This seems incredibly hacky and would require extra code to save the error from the catch block.


      3. Check if the component is mounted in the finally block. This is also hacky and requires boilerplate code to update a this.isMounted flag.


      4. Put the cleanup code at the end of try and after the condition in catch. This is not DRY. Humans are also very forgetful; I cannot count how many times I have forgotten to set isLoading = false in catch.


      5. Define a cleanup() function before the try and call it in try and catch. This is a decent option, but requires extra function calls, making it harder to follow.


      So far, it looks like the first or fifth options are best, depending on how much you care about seeing warning messages. Am I missing any good options?







      react.js axios





      share












      share










      share



      share










      asked 3 mins ago









      MarcelMarcel

      1255




      1255




















          0






          active

          oldest

          votes












          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "196"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217802%2fidomatic-way-to-ignore-finally-block-after-cancelling-network-request%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217802%2fidomatic-way-to-ignore-finally-block-after-cancelling-network-request%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          名間水力發電廠 目录 沿革 設施 鄰近設施 註釋 外部連結 导航菜单23°50′10″N 120°42′41″E / 23.83611°N 120.71139°E / 23.83611; 120.7113923°50′10″N 120°42′41″E / 23.83611°N 120.71139°E / 23.83611; 120.71139計畫概要原始内容臺灣第一座BOT 模式開發的水力發電廠-名間水力電廠名間水力發電廠 水利署首件BOT案原始内容《小檔案》名間電廠 首座BOT水力發電廠原始内容名間電廠BOT - 經濟部水利署中區水資源局

          Prove that NP is closed under karp reduction?Space(n) not closed under Karp reductions - what about NTime(n)?Class P is closed under rotation?Prove or disprove that $NL$ is closed under polynomial many-one reductions$mathbfNC_2$ is closed under log-space reductionOn Karp reductionwhen can I know if a class (complexity) is closed under reduction (cook/karp)Check if class $PSPACE$ is closed under polyonomially space reductionIs NPSPACE also closed under polynomial-time reduction and under log-space reduction?Prove PSPACE is closed under complement?Prove PSPACE is closed under union?

          Is my guitar’s action too high? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)Strings too stiff on a recently purchased acoustic guitar | Cort AD880CEIs the action of my guitar really high?Μy little finger is too weak to play guitarWith guitar, how long should I give my fingers to strengthen / callous?When playing a fret the guitar sounds mutedPlaying (Barre) chords up the guitar neckI think my guitar strings are wound too tight and I can't play barre chordsF barre chord on an SG guitarHow to find to the right strings of a barre chord by feel?High action on higher fret on my steel acoustic guitar