ข้ามไปยังเนื้อหา

Async / Await

คีย์เวิร์ด async หน้าการประกาศฟังก์ชันทำให้กลายเป็น async function ฟังก์ชัน async คืน Promise เสมอ — แม้คุณจะ return ค่าธรรมดา ค่านั้นจะถูกห่อด้วย Promise.resolve(value) โดยอัตโนมัติ

async function greet() {
return 'hello';
}
greet().then(function(v) { console.log(v); }); // hello

ภายในฟังก์ชัน async await หยุดการทำงานชั่วคราวจนกว่า Promise จะ settle แล้วทำงานต่อด้วยค่าที่ resolve มา ส่วนที่เหลือของโปรแกรมยังทำงานต่อระหว่างที่ await

async function loadUser() {
var user = await fetchUser(42); // หยุดตรงนี้จนกว่า fetchUser resolve
var posts = await fetchPosts(user.id);
return posts;
}

ห่อ expression await ด้วย try/catch เพื่อจัดการการ reject:

async function run() {
try {
var data = await fetchData();
console.log(data);
} catch (err) {
console.error('Failed:', err.message);
}
}

การเรียก await สองครั้งแบบเรียงลำดับจะทำงานทีละอัน — อันที่สองเริ่มหลังอันแรกทำเสร็จเท่านั้น:

var a = await fetchA(); // รอ
var b = await fetchB(); // แล้วรออีกครั้ง

หากต้องการรันทั้งสองพร้อมกัน ให้เริ่ม Promise ก่อนแล้ว await พร้อมกัน:

var [a, b] = await Promise.all([fetchA(), fetchB()]);

สนิปเป็ตด้านล่างใช้ตัวช่วย fakeFetch (อิง setTimeout) เพื่อจำลองการเรียก async โดยเรียกแบบเรียงลำดับก่อน แล้วเรียกทั้งสองแบบขนานด้วย Promise.all

JavaScript

ผลลัพธ์: Sequential: A then B, แล้ว Parallel: A and B

async function คืนค่าอะไรเสมอ?
วิธีที่ถูกต้องในการจัดการการ reject จาก Promise ที่ await คือข้อใด?
รูปแบบใดรันสองงาน async พร้อมกันแทนที่จะเรียงลำดับ?