복붙노트

[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. ==============================

    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 );
    })
    
  2. from https://stackoverflow.com/questions/10019903/for-loop-get-items-from-redis-delay by cc-by-sa and MIT license