<?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: Ivan Tanev</title>
    <description>The latest articles on DEV Community by Ivan Tanev (@vantanev).</description>
    <link>https://dev.to/vantanev</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%2F436936%2F93c1a96e-506d-4238-97e4-08f0a61e57ae.jpeg</url>
      <title>DEV Community: Ivan Tanev</title>
      <link>https://dev.to/vantanev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vantanev"/>
    <language>en</language>
    <item>
      <title>Quick Tip: Simpler sharding configuration for Playwright</title>
      <dc:creator>Ivan Tanev</dc:creator>
      <pubDate>Fri, 23 Feb 2024 21:07:46 +0000</pubDate>
      <link>https://dev.to/vantanev/quick-tip-simpler-sharding-configuration-for-playwright-43ke</link>
      <guid>https://dev.to/vantanev/quick-tip-simpler-sharding-configuration-for-playwright-43ke</guid>
      <description>&lt;p&gt;Playwright’s &lt;a href="https://playwright.dev/docs/test-sharding"&gt;sharding docs&lt;/a&gt; present the following GitHub actions configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;fail-fast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;shardIndex&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;shardTotal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Playwright tests&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;npx playwright test \ &lt;/span&gt;
      &lt;span class="s"&gt;--shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While it works, I think the following reads much better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;fail-fast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;shard&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1/4"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2/4"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3/4"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4/4"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Playwright tests&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx playwright test --shard=${{ matrix.shard }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't even need the quotes around &lt;code&gt;"1/4"&lt;/code&gt;, you could write them naked, but I prefer to be explicit in yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="na"&gt;shard&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;1/4&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2/4&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;3/4&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;4/4&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What do you think?&lt;/p&gt;

</description>
      <category>playwright</category>
      <category>githubactions</category>
      <category>ci</category>
      <category>testing</category>
    </item>
    <item>
      <title>Make Your Jest Tests up to 20% Faster by Changing a Single Setting</title>
      <dc:creator>Ivan Tanev</dc:creator>
      <pubDate>Thu, 25 Mar 2021 22:06:22 +0000</pubDate>
      <link>https://dev.to/vantanev/make-your-jest-tests-up-to-20-faster-by-changing-a-single-setting-i36</link>
      <guid>https://dev.to/vantanev/make-your-jest-tests-up-to-20-faster-by-changing-a-single-setting-i36</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://ivantanev.com/make-jest-faster/"&gt;ivantanev.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;When you have &lt;code&gt;Jest&lt;/code&gt; as your test runner, passing the &lt;code&gt;--maxWorkers=50%&lt;/code&gt; option will make the tests faster in most cases. For watch mode, use &lt;code&gt;--maxWorkers=25%&lt;/code&gt;, and for CI disable Jest workers with &lt;code&gt;--runInBand&lt;/code&gt;. You can experiment with the percentage and fine-tune for your particular setup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;standalone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Jest&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest --maxWorkers=50%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:watch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest --watch --maxWorkers=25%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:ci"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest --runInBand"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;React&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;App&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-scripts test --watchAll=false --maxWorkers=50%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:watch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-scripts test --maxWorkers=25%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:ci"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-scripts test --watchAll=false --runInBand"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Update 2021-03-29
&lt;/h2&gt;

&lt;p&gt;While a lot of people have reported great results, I have seen some indication that on older Intel CPUs without hyperthreading the above setting results in a performance degradation. You should benchmark and validate for your particular setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Jest selects the number of workers to use
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/facebook/jest"&gt;Jest test runner&lt;/a&gt;—that is also supplied by default with &lt;a href="https://reactjs.org/docs/create-a-new-react-app.html"&gt;Create React App&lt;/a&gt;—does not run optimally out of the box.&lt;/p&gt;

&lt;p&gt;By default, &lt;a href="https://github.com/facebook/jest/blob/2d965261493febb8e6c679965010f29ea8c9316a/packages/jest-config/src/getMaxWorkers.ts#L23-L32"&gt;Jest will run on all available CPU threads&lt;/a&gt;, using one thread for the cli process and the rest for test workers. When in watch mode, it will use half the available CPU threads.&lt;/p&gt;

&lt;p&gt;This however results in sub-optimal performance on all systems I tested on.&lt;/p&gt;

&lt;p&gt;We can adjust &lt;code&gt;--maxWorkers&lt;/code&gt; by either providing a number of threads, or a percentage of the available system threads. I prefer using percentage, as it's usually easy to find a value that works across multiple systems with different CPUs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarking Jest with --maxWorkers=50%
&lt;/h2&gt;

&lt;p&gt;These are the stats for the testsuite used. It's a React app with mostly unit tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Test Suites: 43 passed, 43 total
Tests:       1 skipped, 258 passed, 259 total
Snapshots:   2 passed, 2 total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here are the results on an Intel i9-9900KS (5GHz / 8 cores 16 threads):&lt;br&gt;A 21% speedup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;hyperfine &lt;span class="s1"&gt;'npm test'&lt;/span&gt; &lt;span class="s1"&gt;'npm test -- --maxWorkers=50%'&lt;/span&gt;
Benchmark &lt;span class="c"&gt;#1: npm test&lt;/span&gt;
  Time &lt;span class="o"&gt;(&lt;/span&gt;mean ± σ&lt;span class="o"&gt;)&lt;/span&gt;:      4.763 s ±  0.098 s    &lt;span class="o"&gt;[&lt;/span&gt;User: 49.334 s, System: 5.996 s]
  Range &lt;span class="o"&gt;(&lt;/span&gt;min … max&lt;span class="o"&gt;)&lt;/span&gt;:    4.651 s …  4.931 s    10 runs

Benchmark &lt;span class="c"&gt;#2: npm test -- --maxWorkers=50%&lt;/span&gt;
  Time &lt;span class="o"&gt;(&lt;/span&gt;mean ± σ&lt;span class="o"&gt;)&lt;/span&gt;:      3.925 s ±  0.044 s    &lt;span class="o"&gt;[&lt;/span&gt;User: 27.776 s, System: 4.028 s]
  Range &lt;span class="o"&gt;(&lt;/span&gt;min … max&lt;span class="o"&gt;)&lt;/span&gt;:    3.858 s …  3.973 s    10 runs

Summary
  &lt;span class="s1"&gt;'npm test -- --maxWorkers=50%'&lt;/span&gt; ran
    1.21 ± 0.03 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here are the results on a 2016 13" MacBook Pro (3.3GHz / 2 cores 4 threads):&lt;br&gt;A 14% speedup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;hyperfine &lt;span class="s1"&gt;'npm test'&lt;/span&gt; &lt;span class="s1"&gt;'npm test -- --maxWorkers=50%'&lt;/span&gt;
Benchmark &lt;span class="c"&gt;#1: npm test&lt;/span&gt;
  Time &lt;span class="o"&gt;(&lt;/span&gt;mean ± σ&lt;span class="o"&gt;)&lt;/span&gt;:     14.380 s ±  0.230 s    &lt;span class="o"&gt;[&lt;/span&gt;User: 22.869 s, System: 3.689 s]
  Range &lt;span class="o"&gt;(&lt;/span&gt;min … max&lt;span class="o"&gt;)&lt;/span&gt;:   14.049 s … 14.807 s    10 runs

Benchmark &lt;span class="c"&gt;#2: npm test -- --maxWorkers=50%&lt;/span&gt;
  Time &lt;span class="o"&gt;(&lt;/span&gt;mean ± σ&lt;span class="o"&gt;)&lt;/span&gt;:     12.567 s ±  0.213 s    &lt;span class="o"&gt;[&lt;/span&gt;User: 19.628 s, System: 3.290 s]
  Range &lt;span class="o"&gt;(&lt;/span&gt;min … max&lt;span class="o"&gt;)&lt;/span&gt;:   12.258 s … 12.942 s    10 runs

Summary
  &lt;span class="s1"&gt;'npm test -- --maxWorkers=50%'&lt;/span&gt; ran
    1.14 ± 0.03 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally, a 2020 M1 MacBook Air:&lt;br&gt;A 12% speedup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;hyperfine &lt;span class="s1"&gt;'npm test'&lt;/span&gt; &lt;span class="s1"&gt;'npm test -- --maxWorkers=50%'&lt;/span&gt;
Benchmark &lt;span class="c"&gt;#7: npm run test&lt;/span&gt;
  Time &lt;span class="o"&gt;(&lt;/span&gt;mean ± σ&lt;span class="o"&gt;)&lt;/span&gt;:      5.833 s ±  0.025 s    &lt;span class="o"&gt;[&lt;/span&gt;User: 30.257 s, System: 6.995 s]
  Range &lt;span class="o"&gt;(&lt;/span&gt;min … max&lt;span class="o"&gt;)&lt;/span&gt;:    5.813 s …  5.861 s    3 runs

Benchmark &lt;span class="c"&gt;#4: npm test -- --maxWorkers=50%&lt;/span&gt;
  Time &lt;span class="o"&gt;(&lt;/span&gt;mean ± σ&lt;span class="o"&gt;)&lt;/span&gt;:      5.216 s ±  0.060 s    &lt;span class="o"&gt;[&lt;/span&gt;User: 19.301 s, System: 3.523 s]
  Range &lt;span class="o"&gt;(&lt;/span&gt;min … max&lt;span class="o"&gt;)&lt;/span&gt;:    5.179 s …  5.285 s    3 runs

Summary
  &lt;span class="s1"&gt;'npm test -- --maxWorkers=50%'&lt;/span&gt; ran
    1.12 ± 0.01 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What about running alongside other programs?
&lt;/h2&gt;

&lt;p&gt;Measuring this is harder, but I have noticed that running with &lt;code&gt;--maxWorkers=25%&lt;/code&gt; performs the best for my use cases.&lt;br&gt;
This gives the best performance for &lt;code&gt;test:watch&lt;/code&gt; alongside code watch/hot reloading, and for running &lt;code&gt;husky&lt;/code&gt; commit hooks in parallel.&lt;/p&gt;
&lt;h2&gt;
  
  
  What about CI?
&lt;/h2&gt;

&lt;p&gt;In my &lt;a href="https://github.com/facebook/jest/issues/8202"&gt;and other's&lt;/a&gt; experience, &lt;code&gt;--runInBand&lt;/code&gt; can be the fastest option for CI runs.&lt;/p&gt;

&lt;p&gt;What does &lt;code&gt;--runInBand&lt;/code&gt; do? From the &lt;a href="https://jestjs.io/docs/cli#--runinband"&gt;official docs&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run all tests serially in the current process, rather than creating a worker pool of child processes that run tests. This can be useful for debugging.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Turns out, it's also useful in resource-constrained environments like CI, where the overhead of worker processes is higher than the speedup of running tests in parallel.&lt;/p&gt;
&lt;h2&gt;
  
  
  Finding the optimal number of threads for a given testsuite/system
&lt;/h2&gt;

&lt;p&gt;It's easy to write a small script to find the optimal number of threads for your particular usecase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;MAX_WORKERS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;15&lt;span class="p"&gt;;&lt;/span&gt; hyperfine &lt;span class="nt"&gt;--parameter-scan&lt;/span&gt; num_threads 1 &lt;span class="nv"&gt;$MAX_WORKERS&lt;/span&gt; &lt;span class="s1"&gt;'npm run test -- --maxWorkers={num_threads}'&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 3 &lt;span class="nt"&gt;-w&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here are the results on an Intel i9-9900KS (5GHz / 8 cores 16 threads):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Summary
  &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=7'&lt;/span&gt; ran
    1.01 ± 0.01 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=8'&lt;/span&gt;
    1.02 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=6'&lt;/span&gt;
    1.04 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=5'&lt;/span&gt;
    1.05 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=9'&lt;/span&gt;
    1.08 ± 0.03 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=10'&lt;/span&gt;
    1.11 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=11'&lt;/span&gt;
    1.11 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=4'&lt;/span&gt;
    1.18 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=13'&lt;/span&gt;
    1.19 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=14'&lt;/span&gt;
    1.21 ± 0.04 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=12'&lt;/span&gt;
    1.23 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=15'&lt;/span&gt;
    1.25 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=3'&lt;/span&gt;
    1.58 ± 0.02 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=2'&lt;/span&gt;
    2.55 ± 0.04 &lt;span class="nb"&gt;times &lt;/span&gt;faster than &lt;span class="s1"&gt;'npm run test:jest -- --maxWorkers=1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the optimal number of workers in this case is 7, not the 8 that &lt;code&gt;50%&lt;/code&gt; would give us. However the difference between the two is within the margin of error, and &lt;code&gt;50%&lt;/code&gt; is more flexible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Jest performance out of the box can be easily improved by tweaking &lt;code&gt;maxWorkers&lt;/code&gt;. If you decide to test this for yourself, &lt;a href="https://github.com/sharkdp/hyperfine"&gt;hyperfine&lt;/a&gt; makes it very easy.&lt;/p&gt;

&lt;p&gt;Hope this was helpful! Feel free to reach out to me on Twitter &lt;a href="https://twitter.com/VanTanev"&gt;@VanTanev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>performance</category>
      <category>jest</category>
    </item>
    <item>
      <title>Async Functions and AngularJs 1.X Do Not Mix</title>
      <dc:creator>Ivan Tanev</dc:creator>
      <pubDate>Sun, 21 Mar 2021 16:50:11 +0000</pubDate>
      <link>https://dev.to/vantanev/async-functions-and-angularjs-1-x-do-not-mix-3kb3</link>
      <guid>https://dev.to/vantanev/async-functions-and-angularjs-1-x-do-not-mix-3kb3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://ivantanev.com/async-functions-and-angularjs-1-x-do-not-mix/"&gt;ivantanev.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Recently, I was refactoring an AngularJS 1.x project and wrote the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DO NOT USE THIS CODE, IT BREAKS ANGULARJS!&lt;/span&gt;
&lt;span class="c1"&gt;// Combining $http with async functions does not work in AngularJS 1.X&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;updateItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;$http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/items/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While the above might seem innocent enough, it breaks Angular's digest cycle. When the promise fulfills, you will not see the page update.&lt;/p&gt;

&lt;h3&gt;
  
  
  What you should do instead?
&lt;/h3&gt;

&lt;p&gt;Do not use &lt;code&gt;await/async&lt;/code&gt; with &lt;a href="https://docs.angularjs.org/api/ng/service/%24http"&gt;$http&lt;/a&gt;. Instead, use the old promise style, with &lt;code&gt;.then()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Use promise.then() instead of async/await&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;updateItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;$http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/items/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While the above might seem like completely reasonable and modern JavaScript, attempting to use it will break Angular's digest cycle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where does it break?
&lt;/h3&gt;

&lt;p&gt;Let's look at what the browser does when it executes the &lt;code&gt;async/await&lt;/code&gt; code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DO NOT USE THIS CODE, IT BREAKS ANGULARJS!&lt;/span&gt;
&lt;span class="c1"&gt;// Combining $http with async functions does not work in AngularJS 1.X&lt;/span&gt;

&lt;span class="c1"&gt;// This function:&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;updateItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;$http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/items/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;// Is equivalent to the following code:&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;updateItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/items/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the original &lt;code&gt;$q&lt;/code&gt; promise returned from &lt;code&gt;$http.put()&lt;/code&gt; is wrapped in a new &lt;code&gt;Promise.resolve()&lt;/code&gt;. This means AngularJS can no longer track when the promise settles.&lt;/p&gt;

&lt;p&gt;The issue comes up when you try to use the async version of &lt;code&gt;updateItem()&lt;/code&gt; in a controller:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;SomeCtrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initialItem&lt;/span&gt;

  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;updateItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updatedItem&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;updatedItem&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;async function&lt;/code&gt; implementation of &lt;code&gt;updateItem()&lt;/code&gt; would break the highlighted line. The changed &lt;code&gt;$scope.item&lt;/code&gt; variable will not be reflected in the DOM, or watchers, until a random digest cycle executes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The reason is that AngularJS cannot know when a plain promise resolves.
&lt;/h3&gt;

&lt;p&gt;AngularJS has special wrappers for browser primitives--&lt;a href="https://docs.angularjs.org/api/ng/service/%24timeout"&gt;$timeout&lt;/a&gt;, &lt;a href="https://docs.angularjs.org/api/ng/service/%24q"&gt;$interval&lt;/a&gt; and its own Promise library &lt;a href="https://docs.angularjs.org/api/ng/service/%24q"&gt;$q&lt;/a&gt;. AngularJS needs to wrap these asynchronous interfaces in order to track when they complete, and run a &lt;a href="https://docs.angularjs.org/api/ng/type/%24rootScope.Scope#%24digest"&gt;$rootScope.$digest()&lt;/a&gt; cycle.&lt;/p&gt;

&lt;p&gt;When we used an &lt;code&gt;async function&lt;/code&gt;, we're in the same predicament as if we'd used &lt;code&gt;setTimeout()&lt;/code&gt; directly instead of &lt;code&gt;$timeout()&lt;/code&gt;--there is no way for AngularJS to track when the execution of the async function completed.&lt;/p&gt;

&lt;p&gt;To make the &lt;code&gt;async function&lt;/code&gt; work in our controller, we would need to re-wrap it with &lt;code&gt;$q.resolve()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;SomeCtrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initialItem&lt;/span&gt;

  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updateItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;updatedItem&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;updatedItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or we could use another &lt;code&gt;async function&lt;/code&gt; and a &lt;a href="https://docs.angularjs.org/api/ng/type/%24rootScope.Scope#%24apply"&gt;$apply()&lt;/a&gt; around our controller property assignment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;SomeCtrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initialItem&lt;/span&gt;

  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updatedItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;updateItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$apply&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;updatedItem&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We end up having to manually wrap any effects of &lt;code&gt;async function&lt;/code&gt; code with &lt;code&gt;$scope.$apply()&lt;/code&gt;, or wrap Promises with &lt;code&gt;$q.resolve()&lt;/code&gt;. This makes it not worth using &lt;code&gt;async/await&lt;/code&gt; in the first place. This is unfortunate when we need to coordinate multiple async tasks, as the &lt;code&gt;async/await&lt;/code&gt; interfaces make that much nicer.&lt;/p&gt;

&lt;h3&gt;
  
  
  In conclusion
&lt;/h3&gt;

&lt;p&gt;Modern &lt;code&gt;async/await&lt;/code&gt; functions are great, and its tempting to want to use them when refactoring old code. However, it's not worth the hassle in AngularJS 1.X projects. We'll have to stick to the &lt;code&gt;$q&lt;/code&gt; promise interfaces instead.&lt;/p&gt;

&lt;p&gt;Say hi on &lt;a href="https://twitter.com/VanTanev"&gt;Twitter&lt;/a&gt; or check out my other posts on &lt;a href="https://ivantanev.com/"&gt;my website&lt;/a&gt;.&lt;br&gt;
Happy coding!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>angular</category>
    </item>
  </channel>
</rss>
