[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.여기 블루 버드의 약속을 사용합니다. 코드의 의도가 오히려 명확하고 더 중첩이없는 방법을 참고.
여기 블루 버드의 약속을 사용합니다. 코드의 의도가 오히려 명확하고 더 중첩이없는 방법을 참고.
먼저,이 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.어떤 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); });
from https://stackoverflow.com/questions/22789236/how-to-call-function-after-completion-of-async-functions-inside-loop by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스은 / 접두사와 레디 스에서 모든 키 및 값을 가져옵니다 (0) | 2020.01.07 |
---|---|
[REDIS] SQLite는의 레디 스 포팅 (0) | 2020.01.07 |
[REDIS] 레디 스 : IS ZADD 더 나은 O (logN)이 삽입 된 요소는 시작 또는 끝 부분에있을 때보다? (0) | 2020.01.07 |
[REDIS] 레디 스 GET SQL SELECT 대 (0) | 2020.01.07 |
[REDIS] 메모리와 CPU 스파이크 레디 스 (0) | 2020.01.07 |