일리삼
21
2019-04-18 16:18:41
1
147

신입/초보가 JS 순서에 대해 질문해봅니다.




    async.waterfall([

            function(callback){
                var test1 = new Array();
                console.log("순서 1");
                Scheduleinfo.find({}, function (err, scheduleinfos){
                    callback(null, scheduleinfos);
                })

            },

            function(req, callback){
                console.log("순서 2");


                var users = new Array();
                var i = 0;
                async.each(req, function(err, callback) {

                    console.log("밖의 반복문 테스트"  + i);

                    // 데이터를 찾아 와야 할 부분
                    Userinfo.findOne({_id: req[i].User}, function (err, val) {

                        console.log("안의 반복문 테스트" + i);
                        console.log("순서 3");

                    })

                    i++;

                })


                callback(null, '임시');
            },

            function(arg, callback){
                console.log("순서 4");
                // 'three'란 문자열을 인자로 final callback 호출
                callback(null, '완성항목');
            }
        ],

// callback (final)

        function(err, result){
            console.log("최종 결과는 " + result); // results가 아니고 result임
        });




안녕하세요.


항상 동기식만 쓰다가  JS를 사용하게 되면서 비동기를 경험해보니


순서가 제멋대로 튀는 상황에서 가르침을 구하려 온 신입인 초보자 입니다.


항상 순서가 튀어버리기 때문에 async를 사용해보라는 말이 있어서


없는 지식과 구글 친구들과 수다를 떨다보니 코드가 이렇게 까지 오게 되었는데요.


원래 생각대로라면 순서 1 -> 순서2 -> 순서 3(반복문 속 findOne 처리) -> 순서 4가 되어야 하지만


실제로는 순서1 -> 순서 2-> (반복문 혼자 돌고) -> 순서 4 -> 순서 3 FindOne 처리가 되네요.


아무래도 반복문 내부의 Mongoose 로 사용하는 

 Userinfo.findOne({_id: req[i].User}, function (err, val) {

                        console.log("안의 반복문 테스트" + i);
                        console.log("순서 3");

                    })

 이 부분이 waterfall이 끝난 이후에 처리가 되는것 같습니다.


이 상황에서 원래 생각했던 순서대로 돌리려면 어떤걸 추가하고 어떤걸 수정해야 할까요?


JS는 처음 만져보는 초보자의 장황한 질문글 읽어주셔서 감사합니다 (_ _)



0
0
  • 답변 1

  • 마루한
    283
    2019-04-18 17:11:48 작성 2019-04-18 17:12:10 수정됨
     async.each(req, function(err, callback) {
    
                        console.log("밖의 반복문 테스트"  + i);
    
                        // 데이터를 찾아 와야 할 부분
                        Userinfo.findOne({_id: req[i].User}, function (err, val) {
    
                            console.log("안의 반복문 테스트" + i);
                            console.log("순서 3");
    
                        })
    
                        i++;
    
                    })
    이 부분이 실행되어 끝나기 전에 마지막 callback이 실행되는 거네요. 위 코드를 비동기가 아닌 동기식으로 짜야 할 것 같습니다.
    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.