<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	
	>
<channel>
	<title>Comments for David Walsh Blog</title>
	<atom:link href="https://davidwalsh.name/comments/feed" rel="self" type="application/rss+xml" />
	<link>https://davidwalsh.name</link>
	<description>A blog featuring tutorials about JavaScript, HTML5, AJAX, PHP, CSS, WordPress, and everything else development.</description>
	<lastBuildDate>Wed, 12 Nov 2025 10:56:39 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.0.2</generator>
	<item>
		<title>Comment on Compress Your XHTML Page Output Using PHP Output Buffers by Johny</title>
		<link>https://davidwalsh.name/php-output-buffers#comment-526798</link>
		<dc:creator><![CDATA[Johny]]></dc:creator>
		<pubDate>Wed, 12 Nov 2025 10:56:39 +0000</pubDate>
		<guid isPermaLink="false">http://davidwalsh.name/compress-xhtml-page-output-php-output-buffers/#comment-526798</guid>
		<description><![CDATA[Thank you! Could you please give me advice! Im using:
&lt;pre class=&quot;php&quot;&gt;compress_page($buffer) {
$search = array(
    &quot;/ +/&quot; =&#062; &quot; &quot;,
    &quot;/&lt;!--\{(.*?)\}--&gt;&#124;&lt;!--(.*?)--&gt;&#124;[\t\r\n]&#124;&lt;!--&#124;--&gt;&#124;\/\/ &lt;!--&#124;\/\/ --&gt;&#124;&#124;\]\]&#062;&#124;\/\/\]\]&#062;&#124;\/\/ &quot;&quot;
);
$buffer = preg_replace(array_keys($search), array_values($search), $buffer);
return $buffer;
}&lt;/pre&gt;

It works well, but my text (in html) has no space after commas!
&lt;pre class=&quot;text&quot;&gt;Hello, how are you? - Hello,how are you?&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<p>Thank you! Could you please give me advice! Im using:</p>
<pre class="php">compress_page($buffer) {
$search = array(
    "/ +/" =&gt; " ",
    "/<!--\{(.*?)\}-->|<!--(.*?)-->|[\t\r\n]|<!--|-->|\/\/ <!--|\/\/ -->||\]\]&gt;|\/\/\]\]&gt;|\/\/ ""
);
$buffer = preg_replace(array_keys($search), array_values($search), $buffer);
return $buffer;
}</pre>
<p>It works well, but my text (in html) has no space after commas!</p>
<pre class="text">Hello, how are you? - Hello,how are you?</pre>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Case Insensitive CSS Attribute Selector by Mark Kenny</title>
		<link>https://davidwalsh.name/css-attribute-case#comment-526726</link>
		<dc:creator><![CDATA[Mark Kenny]]></dc:creator>
		<pubDate>Mon, 03 Nov 2025 22:13:04 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=27859#comment-526726</guid>
		<description><![CDATA[I just used this in JavaScript to find elements based on title attributes:

&lt;pre class=&quot;javascript&quot;&gt;
let testEntries = document.querySelectorAll(&#039;[title^=&quot;${search}&quot; i]&#039;);
&lt;/pre&gt;

Exactly what I was looking for, thanks!]]></description>
		<content:encoded><![CDATA[<p>I just used this in JavaScript to find elements based on title attributes:</p>
<pre class="javascript">
let testEntries = document.querySelectorAll('[title^="${search}" i]');
</pre>
<p>Exactly what I was looking for, thanks!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Gamepad API and Xbox Controller on Mac by Fixerpulse</title>
		<link>https://davidwalsh.name/gamepad-api-xbox-controller-mac#comment-526712</link>
		<dc:creator><![CDATA[Fixerpulse]]></dc:creator>
		<pubDate>Fri, 31 Oct 2025 22:14:39 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=25760#comment-526712</guid>
		<description><![CDATA[Excellent explanation, David. The integration of the Gamepad API with Xbox controllers on macOS is clearly outlined here. Your step-by-step approach makes it much easier to understand the technical flow from driver installation to JavaScript implementation.]]></description>
		<content:encoded><![CDATA[<p>Excellent explanation, David. The integration of the Gamepad API with Xbox controllers on macOS is clearly outlined here. Your step-by-step approach makes it much easier to understand the technical flow from driver installation to JavaScript implementation.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on How to Download a YouTube Video or Channel by kartofelek007</title>
		<link>https://davidwalsh.name/download-youtube-mp3#comment-526521</link>
		<dc:creator><![CDATA[kartofelek007]]></dc:creator>
		<pubDate>Wed, 15 Oct 2025 18:46:38 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=27867#comment-526521</guid>
		<description><![CDATA[And you can download a few videos at once.

1) in the same folder where you have &lt;code&gt;yt-dlp.exe&lt;/code&gt; create file for example &lt;code&gt;list.txt&lt;/code&gt; where you put urls to videos:

&lt;pre class=&quot;text&quot;&gt;
https://www.youtube.com/watch?v=.....
https://www.youtube.com/watch?v=nXeEQ...
https://www.youtube.com/watch?v=.....
&lt;/pre&gt;

2) save, then run this command:

&lt;pre class=&quot;shell&quot;&gt;./yt-dlp.exe -a list.txt -x --audio-format mp3 --audio-quality 0&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<p>And you can download a few videos at once.</p>
<p>1) in the same folder where you have <code>yt-dlp.exe</code> create file for example <code>list.txt</code> where you put urls to videos:</p>
<pre class="text">
https://www.youtube.com/watch?v=.....
https://www.youtube.com/watch?v=nXeEQ...
https://www.youtube.com/watch?v=.....
</pre>
<p>2) save, then run this command:</p>
<pre class="shell">./yt-dlp.exe -a list.txt -x --audio-format mp3 --audio-quality 0</pre>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on How to Download a YouTube Video or Channel by HALWIN</title>
		<link>https://davidwalsh.name/download-youtube-mp3#comment-526307</link>
		<dc:creator><![CDATA[HALWIN]]></dc:creator>
		<pubDate>Wed, 17 Sep 2025 18:34:48 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=27867#comment-526307</guid>
		<description><![CDATA[This is super helpful, David! I’ve used youtube-dl in the past but didn’t realize yt-dlp had become the go-to tool now. The examples you shared make it really easy to follow, especially the audio-only option for mp3 downloads. I also appreciate the bit of nostalgia you added about the old Napster/Kazaa days — it really puts things into perspective on how far media access has come. Looking forward to trying yt-dlp for organizing my own offline playlists!]]></description>
		<content:encoded><![CDATA[<p>This is super helpful, David! I’ve used youtube-dl in the past but didn’t realize yt-dlp had become the go-to tool now. The examples you shared make it really easy to follow, especially the audio-only option for mp3 downloads. I also appreciate the bit of nostalgia you added about the old Napster/Kazaa days — it really puts things into perspective on how far media access has come. Looking forward to trying yt-dlp for organizing my own offline playlists!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Create Zip Files with JavaScript by Nvhcg</title>
		<link>https://davidwalsh.name/javascript-zip#comment-525919</link>
		<dc:creator><![CDATA[Nvhcg]]></dc:creator>
		<pubDate>Sat, 12 Jul 2025 06:03:14 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=26213#comment-525919</guid>
		<description><![CDATA[&lt;pre class=&quot;js&quot;&gt;
// zip.js
import { createWriteStream } from &#039;fs&#039;;
import archiver from &#039;archiver&#039;;

const output = createWriteStream(&#039;s3g-project.zip&#039;);
const archive = archiver(&#039;zip&#039;, { zlib: { level: 9 } });

output.on(&#039;close&#039;, function() {
  console.log(&#039;ZIP created:&#039;, archive.pointer(), &#039;total bytes&#039;);
});

archive.on(&#039;error&#039;, err =&#062; { throw err; });

archive.pipe(output);
archive.directory(&#039;s3g-project/&#039;, false);
archive.finalize();
&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<pre class="js">
// zip.js
import { createWriteStream } from 'fs';
import archiver from 'archiver';

const output = createWriteStream('s3g-project.zip');
const archive = archiver('zip', { zlib: { level: 9 } });

output.on('close', function() {
  console.log('ZIP created:', archive.pointer(), 'total bytes');
});

archive.on('error', err =&gt; { throw err; });

archive.pipe(output);
archive.directory('s3g-project/', false);
archive.finalize();
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Detect Caps Lock with JavaScript by Chris</title>
		<link>https://davidwalsh.name/detect-caps-lock#comment-525862</link>
		<dc:creator><![CDATA[Chris]]></dc:creator>
		<pubDate>Wed, 09 Jul 2025 11:02:41 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=27828#comment-525862</guid>
		<description><![CDATA[Awesome tip! I&#039;ve run into the Caps Lock problem in password fields quite a few times, and this getModifierState method is a straightforward but powerful fix. Love the clear example—I&#039;m definitely going to incorporate this into my login forms.

Plus, it&#039;s neat to see it can recognize other keys like Num Lock and Fn. Thanks for sharing this-it&#039;s a little detail that can significantly enhance user experience!]]></description>
		<content:encoded><![CDATA[<p>Awesome tip! I&#8217;ve run into the Caps Lock problem in password fields quite a few times, and this getModifierState method is a straightforward but powerful fix. Love the clear example—I&#8217;m definitely going to incorporate this into my login forms.</p>
<p>Plus, it&#8217;s neat to see it can recognize other keys like Num Lock and Fn. Thanks for sharing this-it&#8217;s a little detail that can significantly enhance user experience!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on HTML5 Context Menus by Fox</title>
		<link>https://davidwalsh.name/html5-context-menu#comment-525521</link>
		<dc:creator><![CDATA[Fox]]></dc:creator>
		<pubDate>Fri, 13 Jun 2025 08:32:17 +0000</pubDate>
		<guid isPermaLink="false">http://davidwalsh.name/?p=5391#comment-525521</guid>
		<description><![CDATA[It&#039;s 2025. I&#039;m using FireFox. I am unable to see your custom context menu in the demo. :(]]></description>
		<content:encoded><![CDATA[<p>It&#8217;s 2025. I&#8217;m using FireFox. I am unable to see your custom context menu in the demo. :(</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Easy way to upload, transform and deliver files and images (Sponsored) by Amin</title>
		<link>https://davidwalsh.name/easy-way-to-upload-transform-and-deliver-files-and-images#comment-524875</link>
		<dc:creator><![CDATA[Amin]]></dc:creator>
		<pubDate>Sat, 29 Mar 2025 20:44:36 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=27885#comment-524875</guid>
		<description><![CDATA[Filestack seems like a total game-changer for handling media! The seamless integration with services like Google Drive and Dropbox, plus the ability to transform files on the fly, is exactly what developers need to streamline workflows.]]></description>
		<content:encoded><![CDATA[<p>Filestack seems like a total game-changer for handling media! The seamless integration with services like Google Drive and Dropbox, plus the ability to transform files on the fly, is exactly what developers need to streamline workflows.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Being a Dev Dad by Salim</title>
		<link>https://davidwalsh.name/being-a-dev-dad#comment-524768</link>
		<dc:creator><![CDATA[Salim]]></dc:creator>
		<pubDate>Sat, 15 Mar 2025 23:35:38 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=25842#comment-524768</guid>
		<description><![CDATA[Thanks a ton for sharing, dude! It’s all about making an impact. I’m about to be a dad and already feeling the pressure of juggling work and life. Hearing your experience helps a lot, and I really appreciate it!
This article is excellent advice for future Dad like me :)]]></description>
		<content:encoded><![CDATA[<p>Thanks a ton for sharing, dude! It’s all about making an impact. I’m about to be a dad and already feeling the pressure of juggling work and life. Hearing your experience helps a lot, and I really appreciate it!<br />
This article is excellent advice for future Dad like me :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Create Short Preview from Video by jethomps0n</title>
		<link>https://davidwalsh.name/video-preview#comment-524724</link>
		<dc:creator><![CDATA[jethomps0n]]></dc:creator>
		<pubDate>Mon, 10 Mar 2025 19:10:06 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=26077#comment-524724</guid>
		<description><![CDATA[I revised this program and expanded on functionality that wasn&#039;t there originally. The code can be found in this github repo I made: https://github.com/jethomps0n/Video-Preview-Generator.]]></description>
		<content:encoded><![CDATA[<p>I revised this program and expanded on functionality that wasn&#8217;t there originally. The code can be found in this github repo I made: <a href="https://github.com/jethomps0n/Video-Preview-Generator" rel="nofollow">https://github.com/jethomps0n/Video-Preview-Generator</a>.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Confessions of a Web Developer XX by Ehsan</title>
		<link>https://davidwalsh.name/confessions-xx#comment-524701</link>
		<dc:creator><![CDATA[Ehsan]]></dc:creator>
		<pubDate>Thu, 06 Mar 2025 17:50:16 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=27726#comment-524701</guid>
		<description><![CDATA[Leaving a comment is usually hard, but we all love receiving them.

Tonight, I was bored, read your post, and thought I’d write something.

As someone who started with networking due to financial reasons, then moved into sales and marketing, and later transitioned into front-end development, I believe we can’t ignore technology. But the truth is, this isn’t the real technology we were expecting—they’re keeping that hidden from us.]]></description>
		<content:encoded><![CDATA[<p>Leaving a comment is usually hard, but we all love receiving them.</p>
<p>Tonight, I was bored, read your post, and thought I’d write something.</p>
<p>As someone who started with networking due to financial reasons, then moved into sales and marketing, and later transitioned into front-end development, I believe we can’t ignore technology. But the truth is, this isn’t the real technology we were expecting—they’re keeping that hidden from us.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on JavaScript Promise API by John Sendrey</title>
		<link>https://davidwalsh.name/promises#comment-524473</link>
		<dc:creator><![CDATA[John Sendrey]]></dc:creator>
		<pubDate>Tue, 04 Feb 2025 09:48:18 +0000</pubDate>
		<guid isPermaLink="false">http://davidwalsh.name/?p=25616#comment-524473</guid>
		<description><![CDATA[This is a fantastic breakdown of JavaScript Promises! The transition from callback-based async handling to Promises—and now async/await—has truly transformed JavaScript development. I especially appreciate the explanation of Promise.all and Promise.race, as they can be incredibly useful for optimizing API calls.

One thing I’ve found useful is combining Promises with async/await to make code even more readable. For example:

&lt;pre class=&quot;{language}&quot;&gt;

async function fetchData() {
  try {
    const [users, articles] = await Promise.all([
      fetch(&#039;/users.json&#039;).then(res =&#062; res.json()),
      fetch(&#039;/articles.json&#039;).then(res =&#062; res.json())
    ]);
    console.log(users, articles);
  } catch (error) {
    console.error(&#039;Error fetching data:&#039;, error);
  }
}

&lt;/pre&gt;

This keeps the benefits of parallel execution while making the logic easier to follow.]]></description>
		<content:encoded><![CDATA[<p>This is a fantastic breakdown of JavaScript Promises! The transition from callback-based async handling to Promises—and now async/await—has truly transformed JavaScript development. I especially appreciate the explanation of Promise.all and Promise.race, as they can be incredibly useful for optimizing API calls.</p>
<p>One thing I’ve found useful is combining Promises with async/await to make code even more readable. For example:</p>
<pre class="{language}">

async function fetchData() {
  try {
    const [users, articles] = await Promise.all([
      fetch('/users.json').then(res =&gt; res.json()),
      fetch('/articles.json').then(res =&gt; res.json())
    ]);
    console.log(users, articles);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

</pre>
<p>This keeps the benefits of parallel execution while making the logic easier to follow.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on JavaScript Promise API by Travis</title>
		<link>https://davidwalsh.name/promises#comment-523696</link>
		<dc:creator><![CDATA[Travis]]></dc:creator>
		<pubDate>Mon, 28 Oct 2024 16:00:36 +0000</pubDate>
		<guid isPermaLink="false">http://davidwalsh.name/?p=25616#comment-523696</guid>
		<description><![CDATA[That&#039;s exactly right! &lt;code&gt;Promise.race&lt;/code&gt; will settle with the result of the first Promise that either resolves or rejects. Here, since &lt;code&gt;req2&lt;/code&gt; resolves after just 3 seconds, it &quot;wins&quot; the race, and its value, “Second!”, is the one that gets passed to the &lt;code&gt;.then&lt;/code&gt; callback. The result from &lt;code&gt;req1&lt;/code&gt; (“First!”), which takes longer (8 seconds), is ignored, as &lt;code&gt;Promise.race&lt;/code&gt; only cares about the first settled result.]]></description>
		<content:encoded><![CDATA[<p>That&#8217;s exactly right! <code>Promise.race</code> will settle with the result of the first Promise that either resolves or rejects. Here, since <code>req2</code> resolves after just 3 seconds, it &#8220;wins&#8221; the race, and its value, “Second!”, is the one that gets passed to the <code>.then</code> callback. The result from <code>req1</code> (“First!”), which takes longer (8 seconds), is ignored, as <code>Promise.race</code> only cares about the first settled result.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on URL.canParse by picker</title>
		<link>https://davidwalsh.name/url-canparse#comment-523660</link>
		<dc:creator><![CDATA[picker]]></dc:creator>
		<pubDate>Fri, 25 Oct 2024 11:03:11 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=27738#comment-523660</guid>
		<description><![CDATA[It doesn&#039;t work in Typescript (with node v22 and @types/node v22) because:
TS2339: Property &#039;canParse&#039; does not exist on type &#039;{ new (url: string &#124; URL, base?: string &#124; URL &#124; undefined): URL; prototype: URL; createObjectURL(obj: Blob &#124; MediaSource): 
string; revokeObjectURL(url: string): void; }&#039;.]]></description>
		<content:encoded><![CDATA[<p>It doesn&#8217;t work in Typescript (with node v22 and @types/node v22) because:<br />
TS2339: Property &#8216;canParse&#8217; does not exist on type &#8216;{ new (url: string | URL, base?: string | URL | undefined): URL; prototype: URL; createObjectURL(obj: Blob | MediaSource):<br />
string; revokeObjectURL(url: string): void; }&#8217;.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on JavaScript Promise API by Kevin</title>
		<link>https://davidwalsh.name/promises#comment-523599</link>
		<dc:creator><![CDATA[Kevin]]></dc:creator>
		<pubDate>Fri, 18 Oct 2024 20:11:30 +0000</pubDate>
		<guid isPermaLink="false">http://davidwalsh.name/?p=25616#comment-523599</guid>
		<description><![CDATA[You can definitely make consequent promises using JavaScript’s Promise chaining. After your first AJAX request (promise A) resolves successfully, you can initiate your second AJAX request (promise B) in the &lt;code&gt;.then()&lt;/code&gt; block. For instance, if you’re working within a Java app that interacts with a backend, you might structure your AJAX calls like this:

&lt;pre class=&quot;html&quot;&gt;
ajaxPromiseA()
  .then(responseA =&#062; {
    // handle responseA
    return ajaxPromiseB(); // start promise B after promise A is successful
  })
  .then(responseB =&#062; {
    // handle responseB
  })
  .catch(error =&#062; {
    // handle any errors from either promise
  });
&lt;/pre&gt;

This way, you ensure that promise B only runs if promise A succeeds!]]></description>
		<content:encoded><![CDATA[<p>You can definitely make consequent promises using JavaScript’s Promise chaining. After your first AJAX request (promise A) resolves successfully, you can initiate your second AJAX request (promise B) in the <code>.then()</code> block. For instance, if you’re working within a Java app that interacts with a backend, you might structure your AJAX calls like this:</p>
<pre class="html">
ajaxPromiseA()
  .then(responseA =&gt; {
    // handle responseA
    return ajaxPromiseB(); // start promise B after promise A is successful
  })
  .then(responseB =&gt; {
    // handle responseB
  })
  .catch(error =&gt; {
    // handle any errors from either promise
  });
</pre>
<p>This way, you ensure that promise B only runs if promise A succeeds!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on JavaScript Promise API by Kevin</title>
		<link>https://davidwalsh.name/promises#comment-523597</link>
		<dc:creator><![CDATA[Kevin]]></dc:creator>
		<pubDate>Fri, 18 Oct 2024 20:10:02 +0000</pubDate>
		<guid isPermaLink="false">http://davidwalsh.name/?p=25616#comment-523597</guid>
		<description><![CDATA[You can definitely make consequent promises using JavaScript&#039;s &lt;code&gt;Promise&lt;/code&gt; chaining. After your first AJAX request (promise A) resolves successfully, you can initiate your second AJAX request (promise B) in the &lt;code&gt;.then()&lt;/code&gt; block. For instance, if you&#039;re working within a &#060;ahref=&#034;https://timesbeats.com/etsjavaapp-version/&#034; Java app &lt;/a&gt;that interacts with a backend, you might structure your AJAX calls like this:

&lt;code&gt;&lt;/code&gt;`html
&lt;pre class=&quot;javascript&quot;&gt;
ajaxPromiseA()
  .then(responseA =&#062; {
    // handle responseA
    return ajaxPromiseB(); // start promise B after promise A is successful
  })
  .then(responseB =&#062; {
    // handle responseB
  })
  .catch(error =&#062; {
    // handle any errors from either promise
  });
&lt;/pre&gt;
&lt;code&gt;&lt;/code&gt;`

This way, you ensure that promise B only runs if promise A succeeds!]]></description>
		<content:encoded><![CDATA[<p>You can definitely make consequent promises using JavaScript&#8217;s <code>Promise</code> chaining. After your first AJAX request (promise A) resolves successfully, you can initiate your second AJAX request (promise B) in the <code>.then()</code> block. For instance, if you&#8217;re working within a &lt;ahref=&quot;<a href="https://timesbeats.com/etsjavaapp-version/&#038;quot" rel="nofollow">https://timesbeats.com/etsjavaapp-version/&#038;quot</a>; Java app that interacts with a backend, you might structure your AJAX calls like this:</p>
<p><code></code>`html</p>
<pre class="javascript">
ajaxPromiseA()
  .then(responseA =&gt; {
    // handle responseA
    return ajaxPromiseB(); // start promise B after promise A is successful
  })
  .then(responseB =&gt; {
    // handle responseB
  })
  .catch(error =&gt; {
    // handle any errors from either promise
  });
</pre>
<p><code></code>`</p>
<p>This way, you ensure that promise B only runs if promise A succeeds!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on JavaScript Promise API by Kevin</title>
		<link>https://davidwalsh.name/promises#comment-523594</link>
		<dc:creator><![CDATA[Kevin]]></dc:creator>
		<pubDate>Fri, 18 Oct 2024 20:00:32 +0000</pubDate>
		<guid isPermaLink="false">http://davidwalsh.name/?p=25616#comment-523594</guid>
		<description><![CDATA[Thanks, great overview of LimeWire&#039;s new API! Very helpful and concise for getting started quickly!]]></description>
		<content:encoded><![CDATA[<p>Thanks, great overview of LimeWire&#8217;s new API! Very helpful and concise for getting started quickly!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on How I Stopped WordPress Comment Spam by Kevin</title>
		<link>https://davidwalsh.name/wordpress-comment-spam#comment-523542</link>
		<dc:creator><![CDATA[Kevin]]></dc:creator>
		<pubDate>Fri, 11 Oct 2024 13:53:27 +0000</pubDate>
		<guid isPermaLink="false">http://davidwalsh.name/?p=24988#comment-523542</guid>
		<description><![CDATA[I completely understand your frustration with spam comments! It&#039;s amazing how much effort goes into crafting thoughtful content, only to have it drowned in a sea of irrelevant or malicious comments. Managing thousands of spam comments daily can feel like a never-ending battle. Tools like anti-spam plugins can help, but even then, some always slip through the cracks. It&#039;s a necessary part of maintaining a blog, but definitely one of the most draining aspects. Hopefully, finding the right solutions will give you more time to focus on the parts of blogging you actually love!]]></description>
		<content:encoded><![CDATA[<p>I completely understand your frustration with spam comments! It&#8217;s amazing how much effort goes into crafting thoughtful content, only to have it drowned in a sea of irrelevant or malicious comments. Managing thousands of spam comments daily can feel like a never-ending battle. Tools like anti-spam plugins can help, but even then, some always slip through the cracks. It&#8217;s a necessary part of maintaining a blog, but definitely one of the most draining aspects. Hopefully, finding the right solutions will give you more time to focus on the parts of blogging you actually love!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on How to Control CSS Animations with JavaScript by Jeff Madden</title>
		<link>https://davidwalsh.name/control-css-animations-javascript#comment-523516</link>
		<dc:creator><![CDATA[Jeff Madden]]></dc:creator>
		<pubDate>Wed, 09 Oct 2024 10:16:02 +0000</pubDate>
		<guid isPermaLink="false">https://davidwalsh.name/?p=27648#comment-523516</guid>
		<description><![CDATA[Wow! I had no idea you could do that! Is getAnimations in an experimental stage? Are most browsers supporting it?

I use CSS animations a lot! One area where I found frustration was using CSS transform(rotate) combined with transitions. I was building a clock and wanted a smooth motion feel in the clock hands, so transitions were my goal. However, I found that when you try to rotate an element from 360 degrees back to 0 degrees, CSS transitions have to rotate the element in the opposite direction! This was an obviously ugly effect for a clock because clock hands don&#039;t do that! I tried using setTimeout on my animations but that just caused an ugly scenario of setTimeout hell. I tried all sorts of workarounds, but I hate those and none of them seemed to work anyway. Finally, I decided the only way was to create my own transition effects with javascript. This solved my ugly animation problem of rewinding clock hands to return to 0 degrees rotation.]]></description>
		<content:encoded><![CDATA[<p>Wow! I had no idea you could do that! Is getAnimations in an experimental stage? Are most browsers supporting it?</p>
<p>I use CSS animations a lot! One area where I found frustration was using CSS transform(rotate) combined with transitions. I was building a clock and wanted a smooth motion feel in the clock hands, so transitions were my goal. However, I found that when you try to rotate an element from 360 degrees back to 0 degrees, CSS transitions have to rotate the element in the opposite direction! This was an obviously ugly effect for a clock because clock hands don&#8217;t do that! I tried using setTimeout on my animations but that just caused an ugly scenario of setTimeout hell. I tried all sorts of workarounds, but I hate those and none of them seemed to work anyway. Finally, I decided the only way was to create my own transition effects with javascript. This solved my ugly animation problem of rewinding clock hands to return to 0 degrees rotation.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
