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

คลาส - คลาสใน TypeScript: วิธีการเริ่มต้นตัวแปรที่ต้องการพรอมิสหลายตัว?


วัตถุประสงค์ของฉันคือการกำหนดค่าเริ่มต้นให้กับตัวแปร 'page' ภายในคอนสตรัคเตอร์ ปัญหาคือฉันไม่สามารถใช้ make async/await promises ภายในคอนสตรัคเตอร์ได้ ดังนั้นกระบวนการคิดของฉันคือ "โอ้ แค่สร้างเมธอดภายในคลาส แล้วเรียกใช้มันภายในคอนสตรัคเตอร์ก็พอ" แต่แน่นอนว่าฉันคิดผิด Typescript ยังคงเตือนฉันว่า page ยังไม่ได้ถูกกำหนดค่าอย่างแน่นอน ในความเป็นจริง ฉันไม่สามารถเรียกเมธอด "newPage()" บนตัวแปร browser ได้โดยไม่ใช้ async/await จะสามารถแก้ปัญหานี้ได้อย่างไร? ขอบคุณล่วงหน้าสำหรับเวลาของคุณ

class Puppet {
  private page: puppeteer.Page;
  
  contructor() {
    this.initialize();
  }

  async initialize(){
    const browser = await puppeteer.launch({headless:true});
    this.page = await browser.newPage();
    await this.page.goto(this.url);
  }
}

คำตอบ #1

จากวิธีการเรียกของคุณ ให้สร้างวัตถุก่อน จากนั้นเรียกฟังก์ชัน initialize():

class Puppet {
  private page!: puppeteer.Page;

  async initialize(){
    const browser = await puppeteer.launch({headless:true});
    this.page = await browser.newPage();
    await this.page.goto(this.url);
  }
}

// ... in some async function
const puppet = new Puppet();
await puppet.initialize();

หากคุณต้องการทำให้สิ่งนี้สะดวกขึ้นเล็กน้อย ให้เพิ่มฟังก์ชันแฟกทอรีแบบอะซิงโครนัส:

class Puppet {
  private page!: puppeteer.Page;

  async #initialize(){
    const browser = await puppeteer.launch({headless:true});
    this.page = await browser.newPage();
    await this.page.goto(this.url);
  }

  static async create() {
      const puppet = new Puppet();
      await puppet.#initialize();
      return puppet;
  }
}

// ... in some async function
const puppet = await Puppet.create();

สิ่งนี้ยังช่วยให้คุณซ่อนการเริ่มต้นของคุณในฟังก์ชันส่วนตัวได้