라면이 이해할 수 있는 async/await.
9087 단어 JavaScriptAsyncAwaites2017
(19/12/2310:41 추기)
Promise.마지막으로 all를 보충 썼다.
대상
말하자면 async/await는?
async/await는 Promise 기반의 비동기 처리를 더욱 간결하고 효율적으로 기술할 수 있는 방법이다.
일반적으로 Promise를 사용하면 더 깊고 힘든 부분을 살릴 수 있습니다.
'async/await Promise'로 검색하면 비교 내용이 많이 나오기 때문에 이번에는 쓰지 않겠습니다.
편하니까 다 async/await!
나는 이렇게 생각하는데, 사실은 함정이 있다.
이번 이야기는 주의를 기울이지 않으면 효율성이 떨어지는 느낌을 준다.
다만, 나란히 설명해도 잘 모를 것 같아서 여러분이 좋아하는 라면에 비유해보려고 합니다.
같이 라면 만들자!
갑작스럽지만 넌 라면집 주인이야.
너의 라면집에는 솜씨 좋은 점원이 세 명 있다.
분별
(어디서 봤는데)
라면을 만들기 위해서.
API 준비해!
이러한 API가 준비되어 있다고 가정합니다.
끝점
메서드
개요
/noodle
GET
국수 만들기
/soup
GET
수프 제작 및 획득
/pork
GET
자료를 제작하여 얻다
/ramen
POST
라면을 만들다
실현해 보자!
이것은 아무것도 아니다. 매우 간단하다
async () => {
// 麺担当に麺をゆでてもらう
const noodles = await axios.get('/noodle');
// スープ担当にスープを作ってもらう
const soup = await axios.get('/soup');
// 具担当にチャーシューを切ってもらう
const pork = await axios.get('/pork');
// ラーメンを完成させる。
const ramen = await axios.post('/ramen', {
noodles,
soup,
pork
});
// 提供
return ramen;
}
잠시만요!상큼하고 좋은데 NG예요.
await의 함정
await는 지정된 함수의 Promise 결과를 반환할 때까지 async function에서 처리를 일시 중지합니다.
즉
await axios.get('/noodle');
결과가 돌아오기 전에 처리를 기다리다.이 기간에는
/soup
/pork
에 요청하지 않습니다.즉
국수가 다 끓으면 국을 끓이기 시작한다
국이 다 된 후 차슈를 썰기 시작하다
이런 물건은 매우 저효로 변한다!
그렇게 하면 만들 때 면이 넓어져요...
일이 끝나길 혼자 기다리는 게 아니라 세 명의 점원이 있어서 동시에 지시를 하려는 거죠?
어떻게 하면 좋을까요?
await를 사용할 시기를 놓치다.
async () => {
// 麺担当に麺をゆでてもらう
const noodlesPromise = axios.get('/noodle');
// スープ担当にスープを作ってもらう
const soupPromise = axios.get('/soup');
// 具担当にチャーシューを切ってもらう
const porkPromise = axios.get('/pork');
// 全員が出来上がるのを待つ
const noodles = await noodlesPromise;
const soup = await soupPromise;
const pork = await porkPromise;
// ラーメンを完成させる。
const ramen = await axios.post('/ramen', {
noodles,
soup,
pork
});
// 提供
return ramen;
}
await는 프로미스 반환 처리와 조립하기 쉬우나 분리해서 쓸 수도 있습니다.이렇게 하는 거예요.
면 담당, 탕 담당, 조미료 담당 동시 조리 지시.
그 후 모두가 만들었고, 완성되면 이것으로 라면을 완성했다.
그러니까 이루어질 수 있다는 거야.
완성!잘 됐다!
총결산
라면은 하늘하늘한 느낌을 주지만 전달하고 싶은 것은
기다릴 필요가 있으면 기다리고, 기다릴 필요가 없으면 기다리지 않는다.
의식적으로 쓰면 더 좋을 거야.
최후
라면 먹고 싶다고 쓰여 있어서 라면 먹으러 갔어요.
Promiseall 정보
보도의 반응이 매우 커서 나는 깜짝 놀랐다.다시 한 번 감사합니다.
여기 댓글과 트위터는 모두 프로미스입니다.all가 더 좋지 않아요?이런 의견은 이 점에 관한 것이다.
결론적으로 프로미스야.all로도 쓸 수 있어요.그리고 상황에 따라 그게 더 좋은 것 같아요.
예컨대 이번 상황에서는
async () => {
const [noodles, soup, pork] = await Promise.all(['/noodles','/soup','/pork'].map(axios.get));
const ramen = await axios.post('/ramen', {
noodles,
soup,
pork
});
// 提供
return ramen;
}
뭐 그런 거.다만, 이 기사의 의도로 "Promise와 await을 받을 타이밍을 놓칠 수 있다"며 최대한 간단한 기사로 만들려고 해 써야 할지 말아야 할지 모르겠으나 생략했다.
Reference
이 문제에 관하여(라면이 이해할 수 있는 async/await.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7tsuno/items/6d5a27ffe9143b35defe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)