<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="th">
	<id>http://158.108.32.49/wiki/index.php?action=history&amp;feed=atom&amp;title=Js-async-await-gemini</id>
	<title>Js-async-await-gemini - ประวัติรุ่นแก้ไข</title>
	<link rel="self" type="application/atom+xml" href="http://158.108.32.49/wiki/index.php?action=history&amp;feed=atom&amp;title=Js-async-await-gemini"/>
	<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=Js-async-await-gemini&amp;action=history"/>
	<updated>2026-05-06T15:40:29Z</updated>
	<subtitle>ประวัติรุ่นแก้ไขของหน้านี้ในวิกิ</subtitle>
	<generator>MediaWiki 1.33.1</generator>
	<entry>
		<id>http://158.108.32.49/wiki/index.php?title=Js-async-await-gemini&amp;diff=59784&amp;oldid=prev</id>
		<title>Jittat: /* สรุป */</title>
		<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=Js-async-await-gemini&amp;diff=59784&amp;oldid=prev"/>
		<updated>2026-01-08T11:16:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;สรุป&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;th&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;←รุ่นแก้ไขก่อนหน้า&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;รุ่นแก้ไขเมื่อ 11:16, 8 มกราคม 2569&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l119&quot; &gt;แถว 119:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;แถว 119:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== สรุป ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== สรุป ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;1. &lt;/del&gt;JavaScript ทำงานแบบ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;**&lt;/del&gt;Single-Threaded*&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;*&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;* &lt;/ins&gt;JavaScript ทำงานแบบ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;Single-Threaded&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;2. &lt;/del&gt;หลีกเลี่ยง &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;**&lt;/del&gt;Callback Hell&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;** &lt;/del&gt;เพราะดูแลรักษายาก&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* หลีกเลี่ยง &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;Callback Hell&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039; &lt;/ins&gt;เพราะดูแลรักษายาก&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;3. *&lt;/del&gt;*Promise&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;** &lt;/del&gt;ช่วยจัดระเบียบการรอข้อมูล&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;Promise&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039; &lt;/ins&gt;ช่วยจัดระเบียบการรอข้อมูล&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;4. *&lt;/del&gt;*Async/Await&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;** &lt;/del&gt;คือวิธีที่ดีที่สุดในปัจจุบัน ทำให้โค้ดอ่านง่าย สะอาด และจัดการ Error ได้ด้วย `try...catch` ที่คุ้นเคย&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;Async/Await&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039; &lt;/ins&gt;คือวิธีที่ดีที่สุดในปัจจุบัน ทำให้โค้ดอ่านง่าย สะอาด และจัดการ Error ได้ด้วย `try...catch` ที่คุ้นเคย&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;ถ้าเริ่มโปรเจกต์ใหม่ หรือเรียนรู้ตอนนี้ ให้โฟกัสที่การใช้ &amp;#039;&amp;#039;&amp;#039;Async/Await&amp;#039;&amp;#039;&amp;#039; เป็นหลัก&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;ถ้าเริ่มโปรเจกต์ใหม่ หรือเรียนรู้ตอนนี้ ให้โฟกัสที่การใช้ &amp;#039;&amp;#039;&amp;#039;Async/Await&amp;#039;&amp;#039;&amp;#039; เป็นหลัก&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jittat</name></author>
		
	</entry>
	<entry>
		<id>http://158.108.32.49/wiki/index.php?title=Js-async-await-gemini&amp;diff=59783&amp;oldid=prev</id>
		<title>Jittat: /* ยุคปัจจุบัน: Async / Await */</title>
		<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=Js-async-await-gemini&amp;diff=59783&amp;oldid=prev"/>
		<updated>2026-01-08T11:16:11Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;ยุคปัจจุบัน: Async / Await&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;th&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;←รุ่นแก้ไขก่อนหน้า&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;รุ่นแก้ไขเมื่อ 11:16, 8 มกราคม 2569&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l79&quot; &gt;แถว 79:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;แถว 79:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== ยุคปัจจุบัน: Async / Await ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== ยุคปัจจุบัน: Async / Await ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;มาถึงพระเอกของเรา **&lt;/del&gt;Async/Await&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;** &lt;/del&gt;(ES2017) มันคือ &amp;quot;น้ำตาลเคลือบ&amp;quot; (Syntactic Sugar) ของ Promise ที่ช่วยให้เราเขียนโค้ด Asynchronous ให้ดูเหมือนโค้ด Synchronous ปกติ!&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;มาถึง keyword ของเรา &amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;Async/Await&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039; &lt;/ins&gt;(ES2017) มันคือ &amp;quot;น้ำตาลเคลือบ&amp;quot; (Syntactic Sugar) ของ Promise ที่ช่วยให้เราเขียนโค้ด Asynchronous ให้ดูเหมือนโค้ด Synchronous ปกติ!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;`&lt;/del&gt;async&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;`&lt;/del&gt;: ใส่หน้า function เพื่อบอกว่าฟังก์ชันนี้จะทำงานแบบ Async และจะคืนค่าเป็น Promise เสมอ&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;tt&amp;gt;&lt;/ins&gt;async&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/tt&amp;gt;&lt;/ins&gt;: ใส่หน้า function เพื่อบอกว่าฟังก์ชันนี้จะทำงานแบบ Async และจะคืนค่าเป็น Promise เสมอ&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;`&lt;/del&gt;await&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;`&lt;/del&gt;: ใส่หน้า Promise เพื่อสั่งให้ &amp;quot;หยุดรอ&amp;quot; บรรทัดนี้จนกว่าจะได้ผลลัพธ์ (โดยไม่บล็อกการทำงานส่วนอื่นของโปรแกรมหลัก)&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;tt&amp;gt;&lt;/ins&gt;await&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/tt&amp;gt;&lt;/ins&gt;: ใส่หน้า Promise เพื่อสั่งให้ &amp;quot;หยุดรอ&amp;quot; บรรทัดนี้จนกว่าจะได้ผลลัพธ์ (โดยไม่บล็อกการทำงานส่วนอื่นของโปรแกรมหลัก)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;ตัวอย่าง:&amp;#039;&amp;#039;&amp;#039; การทำงานเดียวกันที่เขียนง่ายที่สุด&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;ตัวอย่าง:&amp;#039;&amp;#039;&amp;#039; การทำงานเดียวกันที่เขียนง่ายที่สุด&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jittat</name></author>
		
	</entry>
	<entry>
		<id>http://158.108.32.49/wiki/index.php?title=Js-async-await-gemini&amp;diff=59782&amp;oldid=prev</id>
		<title>Jittat: สร้างหน้าด้วย &quot;&#039;&#039;&#039;JavaScript Async/Await: จาก Callback สู่ความทันสมัย.&#039;&#039;&#039;  การเขียนโปรแกรมแบบ Asyn...&quot;</title>
		<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=Js-async-await-gemini&amp;diff=59782&amp;oldid=prev"/>
		<updated>2026-01-08T11:15:23Z</updated>

		<summary type="html">&lt;p&gt;สร้างหน้าด้วย &amp;quot;&amp;#039;&amp;#039;&amp;#039;JavaScript Async/Await: จาก Callback สู่ความทันสมัย.&amp;#039;&amp;#039;&amp;#039;  การเขียนโปรแกรมแบบ Asyn...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;หน้าใหม่&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;JavaScript Async/Await: จาก Callback สู่ความทันสมัย.&amp;#039;&amp;#039;&amp;#039;  การเขียนโปรแกรมแบบ Asynchronous (อะซิงโครนัส) เป็นหัวใจสำคัญของการทำเว็บแอปพลิเคชันให้ลื่นไหล ในบทความนี้เราจะมาทำความเข้าใจว่าทำไมเราถึงต้องใช้มัน และวิวัฒนาการจากอดีตจนถึงปัจจุบันคือ `async/await`&lt;br /&gt;
&lt;br /&gt;
== ธรรมชาติของ JavaScript: Single-Threaded ==&lt;br /&gt;
JavaScript เป็นภาษาแบบ &amp;#039;&amp;#039;&amp;#039;Single-Threaded&amp;#039;&amp;#039;&amp;#039; หมายความว่ามันมี &amp;quot;สมอง&amp;quot; หรือ Call Stack เพียงอันเดียว ทำงานได้ทีละคำสั่ง (One thing at a time)&lt;br /&gt;
&lt;br /&gt;
สมมติว่าคุณเปิดร้านอาหารตามสั่งที่มีพ่อครัวคนเดียว:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Synchronous (แบบปกติ):&amp;#039;&amp;#039;&amp;#039; ลูกค้า A สั่งกะเพรา -&amp;gt; พ่อครัวทำกะเพรา -&amp;gt; ลูกค้า A ได้กิน -&amp;gt; ลูกค้า B สั่งไข่เจียว -&amp;gt; พ่อครัวทำไข่เจียว&lt;br /&gt;
** &amp;#039;&amp;#039;ปัญหา:&amp;#039;&amp;#039; ถ้าลูกค้า A สั่งเมนูที่ใช้เวลาทำนานมาก (เช่น ต้มซุป 1 ชั่วโมง) ลูกค้า B จะต้องรอจนกว่าลูกค้า A จะได้ของ ถึงจะเริ่มสั่งได้ ร้านจะค้าง (Blocking)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Asynchronous (แบบไม่รอ):&amp;#039;&amp;#039;&amp;#039; ลูกค้า A สั่งซุป -&amp;gt; พ่อครัวรับออเดอร์แล้วตั้งหม้อไว้ (ส่งงานไปทำเบื้องหลัง) -&amp;gt; หันมารับออเดอร์ลูกค้า B ต่อทันที -&amp;gt; พอซุปเสร็จค่อยเสิร์ฟลูกค้า A&lt;br /&gt;
&lt;br /&gt;
ในโปรแกรมจริง งานที่กินเวลานานคือการดึงข้อมูลจาก Server, การอ่านไฟล์, หรือการตั้งเวลา (Timer) ถ้าเราทำแบบ Synchronous หน้าเว็บจะค้าง กดอะไรไม่ได้เลย เราจึงต้องใช้วิธี Asynchronous&lt;br /&gt;
&lt;br /&gt;
== ยุคที่ 1: Callback Hell (นรกของคนรอ) ==&lt;br /&gt;
ในสมัยก่อน เราใช้ &amp;#039;&amp;#039;&amp;#039;Callback function&amp;#039;&amp;#039;&amp;#039; เพื่อบอกว่า &amp;quot;ถ้างานเสร็จแล้ว ให้ทำฟังก์ชันนี้นะ&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; ปัญหา:&lt;br /&gt;
เมื่อมีการทำงานต่อกันหลายๆ ขั้นตอน โค้ดจะซ้อนกันลึกเข้าไปเรื่อยๆ จนเป็นรูปทรงพีระมิด หรือที่เรียกว่า &amp;#039;&amp;#039;&amp;#039;Callback Hell&amp;#039;&amp;#039;&amp;#039; ซึ่งอ่านยากและแก้ไขยากมาก&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ตัวอย่าง:&amp;#039;&amp;#039;&amp;#039; การโหลดข้อมูลผู้ใช้ -&amp;gt; โหลดโพสต์ของผู้ใช้ -&amp;gt; โหลดคอมเมนต์ล่าสุด&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function getUser(id, callback) {&lt;br /&gt;
  setTimeout(() =&amp;gt; {&lt;br /&gt;
   console.log(&amp;quot;ได้ข้อมูลผู้ใช้แล้ว&amp;quot;);&lt;br /&gt;
   callback({ id: id, name: &amp;quot;Somchai&amp;quot; });&lt;br /&gt;
  }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getPosts(user, callback) {&lt;br /&gt;
  setTimeout(() =&amp;gt; {&lt;br /&gt;
    console.log(&amp;quot;ได้โพสต์ของ &amp;quot; + user.name);&lt;br /&gt;
    callback([&amp;quot;Post 1&amp;quot;, &amp;quot;Post 2&amp;quot;]);&lt;br /&gt;
  }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getComments(post, callback) {&lt;br /&gt;
  setTimeout(() =&amp;gt; {&lt;br /&gt;
   console.log(&amp;quot;ได้คอมเมนต์ของ &amp;quot; + post);&lt;br /&gt;
   callback([&amp;quot;Cool!&amp;quot;, &amp;quot;Nice!&amp;quot;]);&lt;br /&gt;
  }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// การเรียกใช้แบบ Callback Hell&lt;br /&gt;
getUser(1, function(user) {&lt;br /&gt;
  getPosts(user, function(posts) {&lt;br /&gt;
    getComments(posts[0], function(comments) {&lt;br /&gt;
      console.log(&amp;quot;จบการทำงาน: &amp;quot; + comments);&lt;br /&gt;
      // ถ้ามี error ต้องดักจับในทุกชั้นเอง&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ยุคที่ 2: Promise (คำสัญญา) ==&lt;br /&gt;
เพื่อแก้ปัญหา Callback Hell จึงเกิด &amp;#039;&amp;#039;&amp;#039;Promise&amp;#039;&amp;#039;&amp;#039; ขึ้นมาใน ES6 (2015)&lt;br /&gt;
&lt;br /&gt;
Promise คือวัตถุที่แทนค่าที่ &amp;quot;อาจจะมีในอนาคต&amp;quot; (สำเร็จ หรือ ล้มเหลว) ช่วยให้เราเขียนโค้ดเป็นลำดับลงมา (Chain) ด้วย `.then()` ได้ ทำให้โค้ดแบนราบลง&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ตัวอย่าง:&amp;#039;&amp;#039;&amp;#039; แปลงฟังก์ชันข้างบนให้คืนค่าเป็น Promise&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// สมมติว่าฟังก์ชันเหล่านี้คืนค่าเป็น Promise แล้ว&lt;br /&gt;
getUser(1)&lt;br /&gt;
  .then(user =&amp;gt; {&lt;br /&gt;
    return getPosts(user); // ส่งต่อให้ .then ถัดไป&lt;br /&gt;
  })&lt;br /&gt;
  .then(posts =&amp;gt; {&lt;br /&gt;
    return getComments(posts[0]);&lt;br /&gt;
  })&lt;br /&gt;
  .then(comments =&amp;gt; {&lt;br /&gt;
    console.log(&amp;quot;จบการทำงาน: &amp;quot; + comments);&lt;br /&gt;
  })&lt;br /&gt;
  .catch(error =&amp;gt; {&lt;br /&gt;
    // ดักจับ error ได้ในจุดเดียว&lt;br /&gt;
    console.error(error);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ถึงแม้จะดีขึ้น แต่ก็ยังมีวงเล็บและ `.then()` เยอะอยู่ดี ถ้าลอจิกซับซ้อน&lt;br /&gt;
&lt;br /&gt;
== ยุคปัจจุบัน: Async / Await ==&lt;br /&gt;
มาถึงพระเอกของเรา **Async/Await** (ES2017) มันคือ &amp;quot;น้ำตาลเคลือบ&amp;quot; (Syntactic Sugar) ของ Promise ที่ช่วยให้เราเขียนโค้ด Asynchronous ให้ดูเหมือนโค้ด Synchronous ปกติ!&lt;br /&gt;
&lt;br /&gt;
* `async`: ใส่หน้า function เพื่อบอกว่าฟังก์ชันนี้จะทำงานแบบ Async และจะคืนค่าเป็น Promise เสมอ&lt;br /&gt;
* `await`: ใส่หน้า Promise เพื่อสั่งให้ &amp;quot;หยุดรอ&amp;quot; บรรทัดนี้จนกว่าจะได้ผลลัพธ์ (โดยไม่บล็อกการทำงานส่วนอื่นของโปรแกรมหลัก)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ตัวอย่าง:&amp;#039;&amp;#039;&amp;#039; การทำงานเดียวกันที่เขียนง่ายที่สุด&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
async function showUserComments() {&lt;br /&gt;
  try {&lt;br /&gt;
    // โค้ดอ่านง่ายเหมือนบรรทัดต่อบรรทัด&lt;br /&gt;
    const user = await getUser(1);&lt;br /&gt;
    const posts = await getPosts(user);&lt;br /&gt;
    const comments = await getComments(posts[0]);&lt;br /&gt;
&lt;br /&gt;
    console.log(&amp;quot;จบการทำงาน: &amp;quot; + comments);&lt;br /&gt;
    &lt;br /&gt;
  } catch (error) {&lt;br /&gt;
    // ใช้ try...catch แบบปกติในการดัก error&lt;br /&gt;
    console.error(&amp;quot;เกิดข้อผิดพลาด:&amp;quot;, error);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
showUserComments();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ตารางเปรียบเทียบ ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! คุณสมบัติ !! Callback !! Promise (.then) !! Async / Await&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;ความอ่านง่าย&amp;#039;&amp;#039;&amp;#039; || ยาก (ซ้อนลึก) || ปานกลาง (Chain ยาว) || ง่ายที่สุด (เหมือนโค้ดปกติ)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;การจัดการ Error&amp;#039;&amp;#039;&amp;#039; || ต้องเช็คทุกชั้น || ใช้ .catch() || ใช้ try...catch&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;ลำดับการทำงาน&amp;#039;&amp;#039;&amp;#039; || ดูยากเมื่อซับซ้อน || ชัดเจนขึ้น || เป็นธรรมชาติ&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Browser Support&amp;#039;&amp;#039;&amp;#039; || ทุกรุ่น || เกือบทุกรุ่น || Browser สมัยใหม่ (Modern)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== สรุป ==&lt;br /&gt;
&lt;br /&gt;
1. JavaScript ทำงานแบบ **Single-Threaded**&lt;br /&gt;
2. หลีกเลี่ยง **Callback Hell** เพราะดูแลรักษายาก&lt;br /&gt;
3. **Promise** ช่วยจัดระเบียบการรอข้อมูล&lt;br /&gt;
4. **Async/Await** คือวิธีที่ดีที่สุดในปัจจุบัน ทำให้โค้ดอ่านง่าย สะอาด และจัดการ Error ได้ด้วย `try...catch` ที่คุ้นเคย&lt;br /&gt;
&lt;br /&gt;
ถ้าเริ่มโปรเจกต์ใหม่ หรือเรียนรู้ตอนนี้ ให้โฟกัสที่การใช้ &amp;#039;&amp;#039;&amp;#039;Async/Await&amp;#039;&amp;#039;&amp;#039; เป็นหลัก&lt;br /&gt;
&lt;br /&gt;
== ตัวอย่างโปรแกรมสำหรับทดลอง ==&lt;br /&gt;
&lt;br /&gt;
: &amp;#039;&amp;#039;ส่วนนี้ไม่ได้เขียนด้วย Gemini แต่มาจาก [[js/async]]&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Code เริ่มต้น ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function doSomething(msg) {&lt;br /&gt;
  let t = Math.random()*1500;&lt;br /&gt;
  setTimeout(() =&amp;gt; {&lt;br /&gt;
    console.log(msg + &amp;quot;  &amp;quot; + t);&lt;br /&gt;
  }, t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(&amp;quot;----started----&amp;quot;);&lt;br /&gt;
doSomething(&amp;quot;A         &amp;quot;);&lt;br /&gt;
doSomething(&amp;quot;  B       &amp;quot;);&lt;br /&gt;
doSomething(&amp;quot;    C     &amp;quot;);&lt;br /&gt;
doSomething(&amp;quot;      D   &amp;quot;);&lt;br /&gt;
doSomething(&amp;quot;        E &amp;quot;);      &lt;br /&gt;
console.log(&amp;quot;---------------&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Callback ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function doSomething(msg, callback) {&lt;br /&gt;
  let t = Math.random()*1500;&lt;br /&gt;
  setTimeout(() =&amp;gt; {&lt;br /&gt;
    console.log(msg + &amp;quot;  &amp;quot; + t);&lt;br /&gt;
    if (callback !== undefined) callback();&lt;br /&gt;
  }, t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(&amp;quot;----started----&amp;quot;);&lt;br /&gt;
doSomething(&amp;quot;A         &amp;quot;, () =&amp;gt; {&lt;br /&gt;
  doSomething(&amp;quot;  B       &amp;quot;, () =&amp;gt; {&lt;br /&gt;
    doSomething(&amp;quot;    C     &amp;quot;, () =&amp;gt; {&lt;br /&gt;
      doSomething(&amp;quot;      D   &amp;quot;, () =&amp;gt; {&lt;br /&gt;
        doSomething(&amp;quot;        E &amp;quot;);      &lt;br /&gt;
      });    &lt;br /&gt;
    });  &lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
console.log(&amp;quot;---------------&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Promise ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function doSomething(msg) {&lt;br /&gt;
  return new Promise((resolve,reject) =&amp;gt; {&lt;br /&gt;
    let t = Math.random()*1500;&lt;br /&gt;
    setTimeout(() =&amp;gt; {&lt;br /&gt;
      console.log(msg + &amp;quot;  &amp;quot; + t);&lt;br /&gt;
      resolve();&lt;br /&gt;
    }, t);&lt;br /&gt;
  });  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(&amp;quot;----started----&amp;quot;);&lt;br /&gt;
doSomething(&amp;quot;A         &amp;quot;)&lt;br /&gt;
  .then(() =&amp;gt; {return doSomething(&amp;quot;  B       &amp;quot;)})&lt;br /&gt;
  .then(() =&amp;gt; {return doSomething(&amp;quot;    C     &amp;quot;)})&lt;br /&gt;
  .then(() =&amp;gt; {return doSomething(&amp;quot;       D  &amp;quot;)})&lt;br /&gt;
  .then(() =&amp;gt; {return doSomething(&amp;quot;         E&amp;quot;)});&lt;br /&gt;
console.log(&amp;quot;---------------&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Async / await ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function doSomething(msg) {&lt;br /&gt;
  return new Promise((resolve,reject) =&amp;gt; {&lt;br /&gt;
    let t = Math.random()*1500;&lt;br /&gt;
    setTimeout(() =&amp;gt; {&lt;br /&gt;
      console.log(msg + &amp;quot;  &amp;quot; + t);&lt;br /&gt;
      resolve();&lt;br /&gt;
    }, t);&lt;br /&gt;
  });  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function main() {&lt;br /&gt;
  await doSomething(&amp;quot;A         &amp;quot;);&lt;br /&gt;
  await doSomething(&amp;quot;  B       &amp;quot;);&lt;br /&gt;
  await doSomething(&amp;quot;    C     &amp;quot;);&lt;br /&gt;
  await doSomething(&amp;quot;       D  &amp;quot;);&lt;br /&gt;
  await doSomething(&amp;quot;         E&amp;quot;);&lt;br /&gt;
  return 10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function main2alternative() {&lt;br /&gt;
  return (main()&lt;br /&gt;
            .then((x) =&amp;gt; { return doSomething(&amp;quot; Z &amp;quot; + x); }));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function main2() {&lt;br /&gt;
  let x = await main();&lt;br /&gt;
  await doSomething(&amp;quot; Z &amp;quot; + x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function main3() {&lt;br /&gt;
  await main2();&lt;br /&gt;
  await doSomething(&amp;quot;---------&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(&amp;quot;----started----&amp;quot;);&lt;br /&gt;
main3();&lt;br /&gt;
console.log(&amp;quot;---------------&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jittat</name></author>
		
	</entry>
</feed>