[REDIS] 레디 스 지연에서 루프 가져 오기 항목의 경우
REDIS레디 스 지연에서 루프 가져 오기 항목의 경우
나는 함께 / 노드 레디 스 Node.js를 사용하고 다음 결과를 반환 객체를 통해 반복 및 레디 스에서 데이터를 찾고 있어요.
나는이 같은 설정을 가지고 :
for (var key in items) {
if (items.hasOwnProperty(key)) {
app.client.llen(items[key].id+'_click', function(err, total) {
items[key].total = total;
});
}
}
callback(items);
문제는 레디 스에 대한 호출을 완료하기 전에 통해 루프이다. 실제로 전체 값을 업데이트되기 전에 그래서 콜백이 호출됩니다. 또한 인한 지연에 일부 항목을 건너 뛸 것으로 보인다.
이 처리하는 더 좋은 방법이 있나요?
감사합니다!
편집하다:
좋아, 그래서 나는 이런 식으로 업데이트했습니다 :
getTotal(function () {
callback(items);
});
getTotal = function (callback) {
var count = 1;
for (var key in items) {
if (items.hasOwnProperty(key)) {
app.client.llen(items[key].id + '_click', function (err, total) {
items[key].total = total;
if (items.length == count) {
callback();
}
count++;
});
};
}
이것은 작동하는 것처럼, 그것은 적절한 시간에 콜백을 트리거 그러나 마지막 키가 점점 총 업데이트 된 것 같다.
해결법
-
==============================
1.레디 스 클라이언트 호출이 비동기 동안 루프 동기이기 때문에 첫 번째 예는 작동하지 않을 수 있습니다. 두 번째 예는 때문에 자바 스크립트 클로저 관리의 더 나은 작동하지 않습니다. 당신은 그 자체가 너무 폐쇄가 제대로 처리 루프에 적절한 범위를해야하고, 모든 총 필드 그에 따라 업데이트되었습니다.
레디 스 클라이언트 호출이 비동기 동안 루프 동기이기 때문에 첫 번째 예는 작동하지 않을 수 있습니다. 두 번째 예는 때문에 자바 스크립트 클로저 관리의 더 나은 작동하지 않습니다. 당신은 그 자체가 너무 폐쇄가 제대로 처리 루프에 적절한 범위를해야하고, 모든 총 필드 그에 따라 업데이트되었습니다.
대해 forEach 쉽게 여기 것으로 보인다 사용 :
getTotal = function (callback) { var count = 0; Object.keys( items ).forEach( function(key) { ++count; app.client.llen(items[key].id + '_click', function (err, total) { items[key].total = total; if ( --count == 0 ) { callback( items ); } }) }) } getTotal( function(items) { console.log( items ); })
from https://stackoverflow.com/questions/10019903/for-loop-get-items-from-redis-delay by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스 메모리 예외 부족하지만, 여전히 충분한 메모리를 가지고 (0) | 2020.01.03 |
---|---|
[REDIS] 레디 스에서 중첩 된 구조의 대안? (0) | 2020.01.03 |
[REDIS] 효율적인 방법은 세트 구성원 업데이트를 레디 스 (0) | 2020.01.03 |
[REDIS] AWS에 레디 스 클러스터와 Laravel 작동하게하는 방법 (0) | 2020.01.03 |
[REDIS] 클러스터 장애 조치 (0) | 2020.01.03 |