비동기/대기는 여전히 당신을 놀라게 할 수 있습니다... 많이!
그는 "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);
}
})();
의견에 대해 어떻게 생각하는지 알려주세요.
Reference
이 문제에 관하여(비동기/대기는 여전히 당신을 놀라게 할 수 있습니다... 많이!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/assuncaocharles/async-await-can-still-surprise-you-a-lot-1ebg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)