node. js async 실천 공유

nodejs 는 이벤트 구동 을 바탕 으로 하 는 것 으로 모든 것 이 비동기 호출 이다. 이런 실현 메커니즘 의 장점 은 확실히 매우 뚜렷 하 다. 그것 은 동기 호출 의 끝 없 는 기다 림 을 피 하 는 것 이다.그동안 node. js 는 사용 하 는 것 이 비교적 흥분 되 었 다. 어느 날 나 는 그것 이 묻 혀 있 는 끝 없 는 리 턴 구덩이 에 빠 져 내 안에 소 가 가득 했다.
가을 이 었 던 것 을 기억 합 니 다. 겨울 쯤 에 제 코드 작은 왕국 에서 작은 일 을 했 습 니 다.저 는 이 일이 너무 작다 고 생각 합 니 다. 작은 것 도 말 하기 부 끄 럽 습 니 다. 하지만 저 는 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 에 대한 실천 이 많 지 않 으 니, 토로 하고 벽돌 을 치 는 것 은 마음대로 하 세 요.

좋은 웹페이지 즐겨찾기