내 응용 프로그램 (모바일 및 웹 모두)에서 이미 (Babel 덕분에) ECMAScript 6 및 ECMAScript 7 기능을 사용 하고 있습니다.
첫 번째 단계는 분명히 ECMAScript 6 레벨이었습니다. 나는 많은 비동기 패턴, 약속 (정말 유망한), 생성기 (* 기호가 왜 있는지 확실하지 않음) 등을 배웠습니다.이 중에서 약속은 제 목적에 꽤 잘 맞았습니다. 그리고 저는 그것들을 제 애플리케이션에서 꽤 많이 사용하고 있습니다.
다음은 기본 약속을 구현 한 방법에 대한 예제 / 의사 코드입니다.
var myPromise = new Promise(
function (resolve,reject) {
var x = MyDataStore(myObj);
resolve(x);
});
myPromise.then(
function (x) {
init(x);
});
시간이 경과, 나는 ECMAScript를 통해 7 개 기능, 그리고 그들 존재의 하나 온 ASYNC
및 AWAIT
키워드 / 기능. 이것들은 함께 놀라운 일을합니다. 내 약속 중 일부를 async & await
. 프로그래밍 스타일에 큰 가치를 더하는 것 같습니다.
다시, 여기 내 async, await 함수가 어떻게 보이는지에 대한 의사 코드가 있습니다.
async function myAsyncFunction (myObj) {
var x = new MyDataStore(myObj);
return await x.init();
}
var returnVal = await myAsyncFunction(obj);
구문 오류 (있는 경우)를 제쳐두고 두 가지 모두 똑같은 작업을 수행합니다. 나는 거의 대부분의 약속을 비동기로 대체 할 수있었습니다.
promise가 비슷한 작업을 수행 할 때 async, await가 필요한 이유는 무엇입니까?
async, await가 더 큰 문제를 해결합니까? 아니면 지옥 콜백에 대한 다른 해결책 이었습니까?
앞서 말했듯이 약속과 비동기를 사용할 수 있으며 동일한 문제를 해결하기를 기다립니다. async await가 해결 한 특정 사항이 있습니까?
추가 참고 사항 :
저는 React 프로젝트와 Node.js 모듈에서 async, awaits 및 promise를 광범위하게 사용했습니다. React는 특히 초기 단계였으며 많은 ECMAScript 6 및 ECMAScript 7 기능을 채택했습니다.
답변
Promises가 비슷한 작업을 수행 할 때 async, await가 필요한 이유는 무엇입니까? async, await가 더 큰 문제를 해결합니까?
async/await
단순히 비동기 코드에 동기식 느낌을줍니다. 그것은 매우 우아한 형태의 통 사적 설탕입니다.
간단한 쿼리 및 데이터 조작을 위해, 약속은 간단 할 수 있지만,이 복잡한 데이터 조작이고 이것 저것 포함 된 시나리오로 실행하면,이 코드는 단순히 경우에 무슨 일이 일어나고 있는지 이해하기 쉽게 보인다 는 동기 비록 (그것은 또 다른 방법 넣어로서, 구문 자체는 async/await
주변을 둘러 볼 수있는 “부수적 복잡성”의 한 형태입니다 .
알고 싶다면 co
같은 종류의 느낌을주기 위해 (제너레이터와 함께)와 같은 라이브러리를 사용할 수 있습니다 . 이와 같은 것들은 async/await
궁극적으로 (기본적으로) 해결되는 문제를 해결하기 위해 개발되었습니다 .
답변
Async / Await는 더 복잡한 시나리오에서 훨씬 더 좋은 구문을 제공합니다. 특히 루프 또는 try
/ 와 같은 다른 특정 구조를 다루는 모든 것 catch
.
예를 들면 :
while (!value) {
const intermediate = await operation1();
value = await operation2(intermediate);
}
이 예제는 Promise를 사용하는 것만으로도 상당히 복잡 할 것입니다.
답변
Promises가 비슷한 작업을 수행 할 때 async, await가 필요한 이유는 무엇입니까? async, await가 더 큰 문제를 해결합니까? 아니면 지옥 콜백에 대한 다른 해결책 이었습니까? 앞서 말했듯이 Promises와 Async, Await를 사용하여 동일한 문제를 해결할 수 있습니다. Async Await가 해결 한 특정 사항이 있습니까?
async
/ await
구문 을 이해해야 할 첫 번째 사항 은 약속을 늘리기위한 구문 설탕 일뿐입니다. 사실 async
함수 의 반환 값은 약속입니다. async
/ await
구문은 동기식으로 비동기식으로 작성할 수있는 가능성을 제공합니다. 다음은 예입니다.
Promise Chaining :
function logFetch(url) {
return fetch(url)
.then(response => response.text())
.then(text => {
console.log(text);
}).catch(err => {
console.error('fetch failed', err);
});
}
Async
함수:
async function logFetch(url) {
try {
const response = await fetch(url);
console.log(await response.text());
}
catch (err) {
console.log('fetch failed', err);
}
}
위의 예에서는 await
프라 미스 ( fetch(url)
)가 해결되거나 거부 될 때까지 기다립니다 . promise가 해결되면 값이 response
변수에 저장되고 promise가 거부되면 오류가 발생하여 catch
블록에 들어갑니다 .
우리는 이미 async
/ 사용 await
이 promise chaining보다 더 읽기 쉽다는 것을 알 수 있습니다. 이것은 우리가 사용하는 약속의 양이 증가 할 때 특히 그렇습니다. Promise chaining 및 async
/ await
콜백 지옥 문제를 해결하고 선택하는 방법은 개인 취향에 따라 다릅니다.
답변
장단점과의 완전한 비교.
일반 JavaScript
- 장점
- 추가 라이브러리 또는 기술이 필요하지 않습니다.
- 최고의 성능 제공
- 타사 라이브러리와의 최고 수준의 호환성 제공
- 임시 및 고급 알고리즘 생성 가능
- 단점
- 추가 코드와 비교적 복잡한 알고리즘이 필요할 수 있음
비동기 (라이브러리)
- 장점
- 가장 일반적인 제어 흐름 패턴 단순화
- 여전히 콜백 기반 솔루션 임
- 좋은 성능
- 단점
- 외부 종속성을 도입합니다.
- 고급 흐름에는 여전히 충분하지 않을 수 있습니다.
약속
- 장점
- 가장 일반적인 제어 흐름 패턴을 대폭 단순화
- 강력한 오류 처리
- ES2015 사양의 일부
- onFulfilled 및 onRejected의 지연된 호출을 보장합니다.
- 단점
- Promisify 콜백 기반 API 필요
- 작은 성능 히트를 소개합니다
발전기
- 장점
- 비 차단 API를 차단하는 것처럼 보이게합니다.
- 오류 처리 단순화
- ES2015 사양의 일부
- 단점
- 보완적인 제어 흐름 라이브러리 필요
- 비 순차적 흐름을 구현하기 위해 여전히 콜백 또는 약속이 필요합니다.
- 생성기 기반이 아닌 API를 thunkify 또는 promisify해야합니다.
비동기 대기
- 장점
- 비 차단 API를 차단처럼 보이게합니다.
- 깔끔하고 직관적 인 구문
- 단점
- 오늘날 사용하려면 Babel 또는 기타 트랜스 파일러와 일부 구성이 필요합니다.
답변
Async / await는 복잡한 제어 흐름이 필요한 경우 코드를 더 깔끔하고 읽기 쉽게 만드는 데 도움이됩니다. 또한 디버그 친화적 인 코드를 생성합니다. 그리고 단지 .NET으로 동기 및 비동기 오류를 모두 처리 할 수 있습니다 try/catch
.
최근에 코드 예제를 사용하여 몇 가지 일반적인 사용 사례에서 async / await의 장점을 보여주는이 게시물을 작성했습니다. JavaScript Async / Await가 약속을 어기는 6 가지 이유 (튜토리얼)