비동기/대기는 여전히 당신을 놀라게 할 수 있습니다... 많이!

나는 기술 ❤을 사랑하고, 우리가 항상 우리를 놀라게 할 무언가가 있다는 것을 얼마나 알고 있는지는 중요하지 않다는 사실입니다. 오늘 내 친구( )가 나에게 다음과 같은 즉각적인 반응을 보여주었다.



그는 "Faster async functions and promises."에 대한 V8 블로그의 기사를 나에게 공유해 주었고, 모든 종류의 흥미로운 것들 중에서 "이건 진짜일 수 없어, 테스트해야 해."라고만 생각할 수 있는 방식으로 내 관심을 끌었습니다.

async/await 동작과 "thenable"함수와 함께 async/await를 사용할 수 있다는 사실을 고려합니다. 무슨 뜻인가요? ".then"메서드가 있는 모든 객체는 async/await와 함께 사용할 수 있습니다.

기사에서 그는 다음과 같은 예를 제시합니다.

class Sleep {
  constructor(timeout) {
    this.timeout = timeout;
  }
  then(resolve, reject) {
    const startTime = Date.now();
    setTimeout(() => resolve(Date.now() - startTime),
               this.timeout);
  }
}

(async () => {
  const actualTime = await new Sleep(1000);
  console.log(actualTime);
})();



네, 저만 보고 마음이 뭉클해진 것이 아니었음을 알려주세요.

이것이 async/await 함수와 코드에서 할 수 있는 일의 가능성에 대해 조금 더 이해하는 데 도움이 된다고 생각합니다. 그러나 그것은 또한 큰 책임을 동반합니다. 단지 기분이 좋다고 해서 모든 곳에서 단순한 약속을 이것으로 대체하지 마십시오.

예외적인 사용 사례를 발견한 경우에만 사용하고 발견한 경우 의견에 공유해 주십시오. 나는 그것에 대해 듣는 것을 좋아합니다! "재시도 전략"을 구현하는 것이 다음 코드의 아이디어를 따르는 것으로 이 사용에 대한 좋은 기회가 아닐지 고려하고 있습니다.

const ServerMock = {
  count: 0,
  getData() {
    if (this.count === 2) {
      return Promise.resolve([{ name: "SomeName" }]);
    } else {
      this.count++;
      return Promise.reject("Error");
    }
  }
};

function fetchData(limit, time) {
  return {
    then(resolve, reject) {
      const retry = setInterval(async () => {
        limit--;
        try {
          console.log("Trying....");
          const data = await ServerMock.getData();
          if (data) {
            console.log("Resolve");
            clearInterval(retry);
            resolve(data);
          }
        } catch {
          if (limit === 0) {
            clearInterval(retry);
            reject("Limit Reached");
          }
        }
      }, time);
    }
  };
}

(async () => {
  try {
    const result = await fetchData(3, 1000);
    console.log(result);
  } catch (err) {
    console.log(err);
  }
})();

의견에 대해 어떻게 생각하는지 알려주세요.

좋은 웹페이지 즐겨찾기