복붙노트

[REDIS] 어떻게 루프 내부 비동기 기능 완료 후 함수를 호출하는 방법?

REDIS

어떻게 루프 내부 비동기 기능 완료 후 함수를 호출하는 방법?

나는,의 값은 다음 레디 스에서 비동기 적으로 검색되는 키의 시리즈를 통해 반복, NodeJS에서 foreach 루프가있다. 루프 및 검색이 완료되면, 나는 응답으로 해당 데이터 집합을 반환하고자합니다.

순간 내 문제는 데이터 검색이 비동기이기 때문에 응답이 전송 될 때, 내 배열이 채워지지 않습니다이다.

어떻게 확인 응답이 데이터를 전송하기 위해 내 foreach 루프와 약속이나 콜백을 사용할 수 있습니까?

exports.awesomeThings = function(req, res) {
    var things = [];
    client.lrange("awesomeThings", 0, -1, function(err, awesomeThings) {
        awesomeThings.forEach(function(awesomeThing) {
            client.hgetall("awesomething:"+awesomeThing, function(err, thing) {
                things.push(thing);
            })
        })
        console.log(things);
        return res.send(JSON.stringify(things));
    })

해결법

  1. ==============================

    1.여기 블루 버드의 약속을 사용합니다. 코드의 의도가 오히려 명확하고 더 중첩이없는 방법을 참고.

    여기 블루 버드의 약속을 사용합니다. 코드의 의도가 오히려 명확하고 더 중첩이없는 방법을 참고.

    먼저,이 hgetall 통화와 클라이언트를 promisify하자 -

    var client = Promise.promisifyAll(client);
    

    자,하자가 약속과 코드, 그 때는 대신 .MAP와 노드 콜백 및 집계를 작성합니다. 어떤 그 때는 일은 비동기 작업이 완료 신호이다. .MAP 사물의 배열을 소요하고 당신의 hgetall 호출 같은 비동기 작업에 모두 매핑합니다.

    블루 버드 (기본적으로) 추가하는 방법 promisifed 방법에 비동기 접미사를합니다.

    exports.awesomeThings = function(req, res) {
        // make initial request, map the array - each element to a result
        return client.lrangeAsync("awesomeThings", 0, -1).map(function(awesomeThing) {
           return client.hgetallAsync("awesomething:" + awesomeThing);
        }).then(function(things){ // all results ready 
             console.log(things); // log them
             res.send(JSON.stringify(things)); // send them
             return things; // so you can use from outside
        });
    };
    
  2. ==============================

    2.어떤 lib가 필요하지 않습니다. 쉬운 파이로, 그냥 비동기 루프입니다. 오류 처리는 생략된다. 당신이해야 할 경우 병렬 비동기 루프는 카운터를 사용합니다.

    어떤 lib가 필요하지 않습니다. 쉬운 파이로, 그냥 비동기 루프입니다. 오류 처리는 생략된다. 당신이해야 할 경우 병렬 비동기 루프는 카운터를 사용합니다.

    exports.awesomeThings = function(req, res) {
        client.lrange("awesomeThings", 0, -1, function(err, awesomeThings) {
            var len = awesomeThings.length;
            var things = [];
            (function again (i){
                if (i === len){
                    //End
                    res.send(JSON.stringify(things));
                }else{
                    client.hgetall("awesomething:"+awesomeThings[i], function(err, thing) {
                        things.push(thing);
    
                        //Next item
                        again (i + 1);
                    })
                }
            })(0);
    });
    
  3. from https://stackoverflow.com/questions/22789236/how-to-call-function-after-completion-of-async-functions-inside-loop by cc-by-sa and MIT license