JavaScript에서 객체 생성 중에 비동기 작업을 어떻게 처리할 수 있나요?

Linda Hamilton
풀어 주다: 2024-11-28 02:09:10
원래의
460명이 탐색했습니다.

How Can I Handle Asynchronous Operations During Object Construction in JavaScript?

생성자에서 async/await를 사용할 수 없음: 비동기 객체 생성에 대한 해결 방법

문제: 생성자 내에서 async/await 구문을 활용하려고 시도 생성자 함수에서 "클래스 생성자가 비동기일 수 없습니다."라는 오류가 발생합니다. method."

원인: 비동기 함수는 promise를 반환하는 반면 생성자는 생성 중인 개체를 반환합니다. 이로 인해 충돌이 발생하여 async/await와 생성자를 동시에 활용하는 것이 불가능해집니다.

해결 방법:

1. 초기화 함수(init()):

  • 클래스 내에 init() 함수를 만듭니다.
  • 생성자는 init()를 호출하여 비동기식을 허용합니다.
  • 사용:

    var myObj = new myClass();
    myObj.init(function() {
      // Use myObj within the callback
    });
    로그인 후 복사
  • 구현:

    class myClass {
      constructor () {
      }
      init (callback) {
          // Asynchronous operations and callback
      }
    }
    로그인 후 복사

2. 빌더 패턴:

  • 직접 호출하면 생성자가 오류를 발생시킵니다.
  • 정적 build() 메서드는 object.
  • 사용:

    myClass.build().then(function(myObj) {
      // Use myObj
    });
    
    async function foo () {
      var myObj = await myClass.build();
    }
    로그인 후 복사
  • 구현:

    class myClass {
      constructor (async_param) {
          if (async_param === undefined) {
              throw new Error('Cannot be called directly');
          }
      }
      static build () {
          return doSomeAsyncStuff()
                 .then(function(async_result){
                     return new myClass(async_result);
                 });
      }
      // Async/await equivalent:
      static async build () {
          var async_result = await doSomeAsyncStuff();
          return new myClass(async_result);
      }
    }
    로그인 후 복사

참고: 빌더는 대신 콜백을 사용할 수 있습니다. promise.

정적 함수 내에서 함수 호출:

  • 정적 함수는 (인스턴스 메서드와 달리) 객체에 바인딩되지 않습니다.
  • 따라서, 이는 인스턴스화된 객체가 아닌 클래스를 참조합니다.
  • 호출하려면 정적 함수의 인스턴스 메서드를 일반 함수 또는 정적 메서드로 만듭니다.

    class A {
      static foo () {
          bar1();   // OK
          A.bar2(); // OK
      }
      static bar2 () {}
    }
    function bar1 () {}
    로그인 후 복사

위 내용은 JavaScript에서 객체 생성 중에 비동기 작업을 어떻게 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿