ไวยากรณ์สำหรับฟังก์ชั่นลูกศร async


497

ฉันสามารถทำเครื่องหมายฟังก์ชันจาวาสคริปต์เป็น "async" (เช่นคืนสัญญา) ด้วยasyncคำหลัก แบบนี้:

async function foo() {
  // do something
}

ไวยากรณ์เทียบเท่าสำหรับฟังก์ชั่นลูกศรคืออะไร


2
เป็นที่น่าสังเกตว่าอย่างน้อย firefox และ babel จะให้คุณทำอย่างนั้น
Jaromanda X

15
var foo = async () => await Promise.resolve('ha');- ทำงานได้ดี
Jaromanda X

2
กำลังพูดว่าit doesn't workไม่มีความหมาย ... คุณได้รับข้อผิดพลาดหรือไม่? บางทีคุณอาจทำสิ่งอื่นผิดโดยไม่มีรหัสที่ "ไม่ทำงาน" และคำอธิบายที่มีความหมายว่ามันใช้งานไม่ได้คุณสามารถเดาได้ว่าคุณกำลังทำอะไรผิดพลาด (หรือใช้เบราว์เซอร์เก่า)
Jaromanda X

1
ที่อาจเป็น @Pointy แต่ทำงานได้ดีใน firefox ปัจจุบันและ chrome และ node.js (7.7.4)
Jaromanda X

1
ข้อมูลจำเพาะ ES2017มีส่วน async ลูกศรคำจำกัดความของฟังก์ชั่น @Pointy
นอกรีต Monkey

คำตอบ:


842

ฟังก์ชันลูกศร Async มีลักษณะเช่นนี้:

const foo = async () => {
  // do something
}

ฟังก์ชั่นลูกศร Async มีลักษณะเช่นนี้สำหรับการโต้แย้งเดียวที่ผ่านไป:

const foo = async evt => {
  // do something with evt
}

ฟังก์ชั่นลูกศร Async มีลักษณะเช่นนี้สำหรับการโต้แย้งหลาย ๆ ครั้งที่ส่งไปยัง:

const foo = async (evt, callback) => {
  // do something with evt
  // return response with callback
}

ที่ไม่ระบุชื่อรูปแบบการทำงานเช่นกัน:

const foo = async function() {
  // do something
}

การประกาศฟังก์ชัน async มีลักษณะดังนี้:

async function foo() {
  // do something
}

การใช้ฟังก์ชั่น async ในการโทรกลับ :

const foo = event.onCall(async () => {
  // do something
})

11
OP ดูเหมือนว่ากำลังมองหาฟังก์ชั่นลูกศรชื่อ async ซึ่งเป็นไวยากรณ์เดียวที่คุณไม่แสดง
jfriend00

48
ที่จริงแล้วการconst foo = async () => {}สร้างฟังก์ชั่นที่มีชื่อว่า async fooชื่อ เป็นไปได้ทั้งหมดที่จะตั้งชื่อฟังก์ชั่นด้วยวิธีนี้ ในการมอบหมาย ES2016 + ของฟังก์ชั่นที่ไม่ระบุชื่อให้กับชื่อตัวแปรหลังจากตัวแปรหากมีการประกาศที่นั่น
Benjamin Gruenbaum

5
@BenjaminGruenbaum โปรดอย่าเรียกชื่อฟังก์ชั่นนี้ ใน js ฟังก์ชั่นที่ไม่ระบุชื่อที่มีชื่อเป็นไวยากรณ์ที่เฉพาะเจาะจงมากfoo = function bar () {}ที่สร้างขึ้นเพื่อแทนที่arguments.calleeเมื่อเขียนฟังก์ชั่นที่ไม่ระบุชื่อซ้ำ สิ่งที่คุณมีมีชื่อตัวแปรfooที่อ้างอิงถึงฟังก์ชัน
slebetman

18
@slebetman ตั้งแต่ ES2015 เมื่อคุณทำconst foo = async () => {}ชื่อของฟังก์ชันถูกตั้งค่าเป็นfoo- ecma-international.org/ecma-262/6.0/…และecma-international.org/ecma-262/6.0/… - ดูการสนทนาในesdiscuss.org / topic / …
Benjamin Gruenbaum

1
@FarisRayhan มันก็เหมือนกับค่าคงที่อื่น ๆ การอ้างอิงของตัวแปรsomefunctionไม่สามารถเปลี่ยนแปลงได้หลังจากตั้งค่า (ชี้ไปที่ฟังก์ชัน async แบบไม่ระบุชื่อของคุณ)
Qwerty

129

นี่เป็นวิธีที่ง่ายที่สุดในการกำหนดนิพจน์asyncฟังก์ชันลูกศรให้กับตัวแปรที่ระบุชื่อ :

const foo = async () => {
  // do something
}

(โปรดทราบว่าสิ่งนี้ไม่เทียบเท่าอย่างเคร่งครัดasync function foo() { }นอกจากความแตกต่างระหว่างfunctionคำหลักและนิพจน์ลูกศรฟังก์ชันในคำตอบนี้ไม่ได้"ยกไปด้านบน" )


11
โปรดทราบว่าการแสดงออกฟังก์ชั่นที่มีชื่อเป็นไวยากรณ์ที่เฉพาะเจาะจงมากในจาวาสคริปต์ นี่ไม่ใช่นิพจน์ฟังก์ชันที่ระบุชื่อ การใช้คำที่ถูกต้องเป็นสิ่งสำคัญเพื่อหลีกเลี่ยงความสับสนในภายหลังเมื่อวลีหนึ่งสามารถพัฒนาให้มีความหมายสองสิ่ง FYI, ฟังก์ชั่นการแสดงออกชื่อคือ: foo = function myName () {}. ชื่อคือmyNameและมันถูกระบุให้มีอยู่เฉพาะในฟังก์ชั่นที่ไม่ระบุชื่อและไม่ได้กำหนดไว้ที่ใดนอก วัตถุประสงค์คือเพื่อแทนที่arguments.calleeเมื่อเขียนฟังก์ชันแบบไม่ระบุชื่อแบบเรียกซ้ำ
slebetman

1
ฉันกำลังจะโต้แย้งคุณ @slebetman เกี่ยวกับด้านเทคนิคเนื่องจากนี่เป็นนิพจน์ฟังก์ชั่น (ลูกศร) และคุณก็จบลงด้วยฟังก์ชั่นที่ตั้งชื่อ (เช่นfoo.name === 'foo') แต่เพียงเพราะมันอยู่ใน initializer ของconstคำสั่ง * - ซึ่งหมายความว่ามันไม่ถูกต้องนักที่จะเรียกสิ่งนี้ว่า "การแสดงออกของฟังก์ชั่นลูกศรชื่อ async" คุณยังถูกต้องด้วยว่าชื่อของฟังก์ชั่นนิพจน์ชื่อนั้นถูกผูกไว้ภายในตัวมันเองเท่านั้น แต่มันยังถูกเก็บไว้ในnameคุณสมบัติของฟังก์ชั่นซึ่งดีสำหรับการดีบั๊ก
Vaz

3
เมื่อต้องการใส่อีกวิธีหนึ่งไม่มีสิ่งเช่น "นิพจน์ฟังก์ชันลูกศรที่มีชื่อ" แต่มันสามารถกลายเป็น "ชื่อ" โดยเป็นส่วนหนึ่งของ const หรือปล่อยให้คำสั่ง (ไม่แน่ใจเกี่ยวกับ var เพราะการชักรอก) ในแง่ของการมี ชื่อfn.nameเช่นเดียวกับการมีขอบเขตในขอบเขต (ตัวแปร)
Vaz

41

ฟังก์ชั่น Async Arrow ทันทีที่เรียกใช้:

(async () => {
    console.log(await asyncFunction());
})();

การแสดงออกของฟังก์ชั่น Async ที่เรียกใช้ทันที:

(async function () {
    console.log(await asyncFunction());
})();



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.