node. js async 실천 공유
가을 이 었 던 것 을 기억 합 니 다. 겨울 쯤 에 제 코드 작은 왕국 에서 작은 일 을 했 습 니 다.저 는 이 일이 너무 작다 고 생각 합 니 다. 작은 것 도 말 하기 부 끄 럽 습 니 다. 하지만 저 는 redis 캐 시 에서 jiangcs 520 이라는 친구 가 키 우 는 강 아 지 를 찾 아야 합 니 다. 일이 이 렇 습 니 다. redis 안에 사용자 표를 저장 하고 사용자 가 어떤 친구 가 있 는 지 기록 하 며 사람 - 개 시 계 를 저장 하 였 습 니 다.사실은 모든 사용자 가 그 개 를 키 웠 다 는 것 을 기록 하고 강아지 시계 도 한 장 있 습 니 다. 강아지 의 Nickname 을 기록 하고 다시 정리 해 드 리 겠 습 니 다. 모두 세 장의 표: user 표, userDog 시계, dog 시계.그럼 제 가 왜 이런 강 아 지 를 찾 아야 합 니까? 일이 이 렇 습 니 다. 봄 이 왔 습 니 다. 강아지 의 봄 도 왔 습 니 다. 그리고 한 친구 (남) 가 블 로 거 (남) 에 게 말 했 습 니 다. 여러분 들 은 친구 가 여러 해 동안 형제 처럼 지 냈 습 니 다. 비록 우 리 는 성별 이 맞지 않 지만 우리 두 강아지 의 성별 이 적당 합 니 다. 결혼 하지 않 으 면 이 일 은 결정 하 겠 습 니 다. 강아지 가 결혼 하 는 날 그 미녀 강아지 가 왔 습 니 다.블 로 거들 의 강 아 지 는 아직도 redis 에 저장 되 어 있 습 니 다. 먼저 소 리 를 질 러 야 합 니 다. 예전 에 자바 를 사용 할 때 편리 하 게 찾 았 습 니 다. 먼저 user 표 에서 블 로 거들 jiangcs 520 을 찾 은 다음 에 userDog 시계 에서 잘 생 긴 강아지 이름 을 찾 아서 dog 시계 에서 그 강 아 지 를 찾 아서 끌 어 내 면 돼 요.그러나 node. js 에 서 는 그렇지 않 습 니 다. 같은 순서 이지 만 모두 가 알 고 있 는 것 은 비동기 입 니 다. 결 과 는 모두 반전 함수 에서 되 돌 아 왔 습 니 다. 위조 코드 는 다음 과 같 습 니 다.
dbDAO.select(usersql,function(err,users){ //
if(err){
logger.error(err);
}else{
if(users){
dbDAO.select(user_dogSql,function(err,user_dogs){// -
if(user_dogs){
dbDAO.select((dogSql,function(err,dogs){//
if(dogs){
" , "
}
}))
}
})
}
}
});
node. js 에 서 는 위 3 층 의 리 턴 이 필요 합 니 다. 이렇게 간단 한 조회 가 필요 합 니 다. 3 층 의 리 턴 이 필요 합 니 다. 만약 에 제 가 강아지 의 친척, 강아지 가 낳 은 파 파 라 치 의 반쪽 친척 을 조회 하려 면 어떻게 해 야 합 니까? 몇 층 을 해 야 합 니까? 몇 백 줄 의 코드 가 모두 리 턴 입 니 다. 누가 쓰 러 지지 않 습 니까? node 는 아직도 사용 하 는 사람 이 있 습 니까?이 위기 의 고비 에 세계 구세주 가 나 타 났 다. 바로 'async' 로 분장 하고 등장 했다.
위의 문제 와 같이 async 는 어떻게 해결 되 었 습 니까? 구세주 가 어떻게 대군 을 구 했 는 지 보 세 요. 위 코드 는 다음 과 같 습 니 다.
async.waterfall([
function(cb){
//
dbDAO.select(usersql,function(err,users){
cb(err,results);
});
},function(results,cb){
// _
dbDAO.select(user_dogSql,function(err,users){
cb(err,results);
});
},function(results,cb){
//
dbDAO.select(dogSql,function(err,users){
cb(err,results);
});
}
],function(err,results){
// ,
})
더 층 차 있 고 또렷 해 보 이 는 것 같 지 않 아 요?여 기 는 async 의 폭포 흐름 waterfull 방법 을 사 용 했 습 니 다. 첫 번 째 매개 변 수 는 실행 해 야 할 방법 배열 입 니 다. 두 번 째 매개 변 수 는 바로 반전 함수 입 니 다. 이 함수 배열 을 관찰 해 보 세 요. 모든 함수 구 조 는 유사 합 니 다. 먼저 첫 번 째 함수, 하나의 매개 변수 cb 가 있 습 니 다. 사실은 이 매개 변 수 는 async 자체 내부 에서 지정 한 것 입 니 다.우리 가 함수 내 에서 우리 가 처리 해 야 할 일 을 처 리 했 을 때 이 함 수 를 호출 해 야 합 니 다. 예 를 들 어 위의 방식 cb (err, results), 그리고 두 번 째 함 수 를 보면 첫 번 째 함수 와 차이 가 있 습 니 다. 두 개의 매개 변수 가 있 습 니 다. results 와 cb. 사실은 이 results 는 지난 함수 가 처리 한 결과 전달 되 었 습 니 다. 폭포 와 같 지 않 습 니까?그래서 폭포 류 라 고 부 른 거 죠?세 번 째 함 수 는 말 하지 않 겠 습 니 다. 마찬가지 입 니 다.cb 리 셋 함수 가 중요 합 니 다. cb 가 실행 을 잊 었 거나 어떤 cb 리 셋 이 실행 되 지 않 았 다 면 이 폭포 흐름 은 계속 할 수 없습니다. waterfull 의 리 셋 함수 도 실행 되 지 않 습 니 다.또 한 가지 상황 이 있 습 니 다. 만약 에 그 중의 한 함수 에 오류 가 발생 하면 다음 함수 가 계속 실행 되 지 않 습 니 다. 현재 cb 리 셋 함 수 를 호출 한 후에 워 터 풀 의 리 셋 함수 에 직접 들 어 갑 니 다.예 를 들 어 저희 가 사용 자 를 조회 하고 있 습 니 다강아지 시 계 를 처리 한 후에 리 턴 함수 cb 를 호출 하 는 것 을 잊 었 습 니 다. 그러면 이 야 기 는 여기 서 끝 났 습 니 다. 계속 내 려 가지 않 을 것 입 니 다. 만약 에 우리 가 이 일 을 잊 지 않 았 다 면 데이터 조회 에서 오류 가 발생 했 습 니 다. 그러면 다음 조회 강아지 시 계 는 없 었 을 것 입 니 다. 그러나 앞의 상황 과 차이 점 은 waterfull 의 리 턴 함수 에 들 어 갈 것 입 니 다.오류 정보 err 는 매개 변수 로 전 달 됩 니 다.
async 는 또 몇 가지 자주 사용 하 는 방법 이 있다. series, parallel, auto 방법 등 이다.업무 논리 가 비교적 복잡 한 상황 에서 이런 방법 들 은 모두 매우 쓰기 좋다.series 는 말 그대로 이해 하기 쉽 고 순서대로 집행 하 며 함수 배열 의 순서에 따라 모든 방법 을 집행 합 니 다. parallel 은 평행 이라는 뜻 입 니 다. 즉, 동시에 집행 한 다 는 뜻 입 니 다. 그러면 구체 적 으로 어떤 함수 가 먼저 돌아 오 는 지 는 말 하기 어렵 지만 리 턴 함수 에서 돌아 온 결 과 는 함수 배열 의 순서에 따라 돌아 갑 니 다.좀 더 구체 적 이 고 상세 한 사용법 을 알려 드 리 겠 습 니 다.http://www.verydemo.com/demo_c441_i206465.html
마지막 으로 굵 고 틀 리 기 쉬 운 부분 을 알려 줍 니 다. 코드 를 검사 한 후에 도 문제 가 없 지만 최종 리 셋 함수 가 실행 되 지 않 았 을 때 함수 배열 의 모든 함수 가 실 행 된 후에 cb 를 호출 했 는 지 확인 할 수 있 습 니 다. 임의의 하나 가 없 으 면 마지막 까지 실행 할 수 없습니다.
이미 async 에 대한 실천 이 많 지 않 으 니, 토로 하고 벽돌 을 치 는 것 은 마음대로 하 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
CORS 문제를 지금 영구적으로 해결하는 방법(2022)아래 코드와 같이 클라이언트 측 앱에서 Google Maps API와 같은 외부 서버 API에서 일부 데이터를 가져오고 싶다고 가정해 보겠습니다. 신속하게 수정하려면 공용 CORS 프록시 서버 중 하나를 사용하십시오...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.