คำสั่ง if - การใช้ตรรกะเชิงเงื่อนไขของ TypeScript บน Promise ช่วยให้สามารถรันโค้ดเมื่อทำงานแบบซิงโครนัส
ฉันมีไลบรารีตรรกะธุรกิจที่มีเมธอดซึ่งถูกออกแบบให้ทำงานแบบอะซิงโครนัส โดยส่งค่า false เพื่อใช้ในประโยค if ถ้าเรียกใช้แบบอะซิงโครนัส มันก็ไม่เป็นไร:
const permissions = new PermissionProvider(userId,appId);
if(await permissions.ifAllowed('invalid action', itemID)){
// This code is not reachable.
}
export class PermissionProvider {
...
public async ifAllowed(action: string, itemId?: string): Promise<boolean> {
return await db.query(params)
.then(() => { return false; }
}
อย่างไรก็ตาม ฉันกังวลว่ามีคนอาจเผลอรันโค้ดแบบซิงโครนัส:
if(permissions.ifAllowed('invalid action', itemID)){
// This code executes because asynchronous functions return a Promise,
// and objects evaluate to true.
}
เพียงแค่บันทึกว่าต้องเรียกใช้งาน API ด้วย async/await ดูเหมือนจะไม่ปลอดภัย สิ่งนี้แย่เป็นพิเศษเพราะอาจไม่ชัดเจนว่าผู้ใช้ปลายทางจะได้รับอนุญาตให้ทำอะไรก็ได้หากละเว้นคีย์เวิร์ด await
ถ้าฉันส่งค่าบูลีนพื้นฐานกลับแทน รหัสแบบอะซิงค์ก็จะคืนค่าเป็น undefined เพราะว่ามาจากฐานข้อมูลในรูปแบบ Promise
มีวิธีแก้ปัญหาที่ดีในการบังคับให้ผู้ใช้งาน API เรียกใช้งานแบบ async หรือป้องกันไม่ให้ if statement ประเมินค่าเป็นจริงหรือไม่?
ฉันพยายามขว้างข้อผิดพลาดที่ไม่ได้จับ แต่โค้ดยังคงทำงานต่อไปเพราะข้อผิดพลาดนั้นถูกขว้างหลังจากที่คำสั่ง if ถูกประมวลผลแล้ว
คำตอบ #1
มีวิธีแก้ปัญหาที่ดีในการบังคับให้ผู้ใช้ API เรียกใช้งานแบบอะซิงค์ หรือป้องกันไม่ให้คำสั่ง if ถูกประเมินเป็นจริงหรือไม่?
คุณสามารถเปิดใช้งาน strict boolean expressions ใน tslint ได้ที่: https://palantir.github.io/tslint/rules/strict-boolean-expressions/
คำตอบ #2
ถ้าคุณต้องใช้ I/O ภายนอก เช่นในกรณีนี้ คุณจะไม่สามารถทำให้มันเป็นแบบ synchronous 100% ได้ นอกจากนี้ยังไม่มีวิธีบังคับให้ใช้ await เพราะการละเว้นมันก็เป็นโค้ดที่ถูกต้อง 100% เรื่องนี้ไม่ใช่ปัญหา แม้แต่สำหรับนักพัฒนา node.js/JS ระดับ Junior เพราะโค้ดแบบ async มีอยู่ทุกที่ แค่เขียนเอกสาร API ของคุณก็จะโอเค