NodeJS에 forEach 루프가 있으며 일련의 키를 반복하며 값은 Redis에서 비동기 적으로 검색됩니다. 루프 및 검색이 완료되면 해당 데이터 세트를 응답으로 반환하고 싶습니다.
현재 내 문제는 데이터 검색이 비동기 적이며 응답이 전송 될 때 배열이 채워지지 않기 때문입니다.
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));
})
여기에서 Bluebird promise를 사용 합니다. 코드의 의도가 얼마나 분명하고 중첩이 없는지 주목하십시오.
첫째,하자 promisify hgetall 호출 및 클라이언트 -
var client = Promise.promisifyAll(client);
이제 .then
노드 콜백 및 .NET Framework를 사용한 집계 대신 promise를 사용 하여 코드를 작성해 보겠습니다 .map
. .then
비동기 작업이 완료되었음을 알리는 것은 무엇입니까? .map
사물의 배열을 가져와 hgetall 호출처럼 모두 비동기 작업에 매핑합니다.
Bluebird가 Async
약속 된 메서드에 접미사 (기본적으로)를 추가하는 방법에 유의하십시오 .
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
});
};
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다