ฉันใช้ TypeScript และ async
/await
เพื่อแสดงเวิร์กโฟลว์แบบอะซิงโครนัส ส่วนหนึ่งของขั้นตอนการทำงานนั้นคือการโทรหาพนักงานเว็บและดำเนินการต่อเมื่อมีการโทรกลับพร้อมผลลัพธ์
ใน C# ฉันจะสร้าง TaskCompletionSource
, await
ของมัน Task
และที่อื่นๆ ในโค้ดจะเรียก SetResult
เพื่อแก้ไข TaskCompletionSource
ฉันสามารถทำสิ่งเดียวกันใน JavaScript ได้ด้วยการเริ่มต้นอ็อบเจ็กต์ Deferrer โดยใช้ Promise.defer()
, await
ing ของมัน Promise
และที่อื่นๆ ใน window.onmessage
Listener จะเรียกใช้เมธอด resolve
(หรือ reject
) เพื่อให้เวิร์กโฟลว์แบบอะซิงโครนัสดำเนินต่อไป
ฟังดูดี แต่ MDN บอกว่า defer
ล้าสมัย วิธีแก้ปัญหาที่เสนอสำหรับการใช้ตัวสร้าง Promise
ซึ่งให้ผู้รับมอบสิทธิ์ทำงานและการเรียกใช้เมธอด resolve
/reject
ไม่ได้ผลสำหรับฉัน เนื่องจากตรรกะนั้นอาจไม่สามารถเข้าถึงได้ ฉันแค่ต้องการให้ object โทร resolve
หรือ reject
บน ในขอบเขตคำศัพท์ที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ฉันไม่สามารถทำเช่นนั้นกับฟังก์ชันนั้นได้
มีตัวช่วยที่เข้ากันได้ย้อนหลังและส่งต่อ ที่ให้วัตถุดังกล่าวแก่ฉันโดยการผูกฟังก์ชัน resolve
และ reject
ที่ฉันสามารถใช้ได้โดยไม่ต้องเปลี่ยนซีแมนทิกส์ของโค้ด แต่นี่เป็นการปฏิบัติที่ไม่ดีหรือไม่? มีรูปแบบที่ได้รับการยอมรับและดีกว่าหรือไม่? สำนวนที่เทียบเท่ากับ TaskCompletionSource
ใน JavaScript คืออะไร