ค้นหาเว็บไซต์

คำสั่ง 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 ของคุณก็จะโอเค