почему [Циркуляр] добавляется в хеш - PullRequest
0 голосов
/ 25 августа 2011

вот мой код

db.query(str, arr, function selectCb(error, results, fields) {
            if (error) {
                return proceed(false, {errno:'010',message:error.message}, request);
            }
            var q = async.queue(function (results, callback) {
                // add the gib infor
                if (results.refertype=='G') {
                    var input={};
                    input.fields="*";
                    input.gibname=results.refername;
                    gib.getgibinternal(input, makeCallback(i));
                    function makeCallback(index) {
                        return function(gresult) {
                            results.gib=gresult.data[0];
                            callback(results);
                        }
                    }
                    // add the user info        
                } else if(results.refertype=='U') {
                    var input={};
                    input.username=results.refername;
                    input.fields="*";
                    user.getuserinternal(input, makeCallbackuser(i));
                    function makeCallbackuser(index) {
                        return function(gresult) {
                            results.user=gresult.data[0];
                            callback(results);
                        }
                    }
                } 

            }, results.length);
            // assign a callback
            q.drain = function() {
                return proceed(true, self.results, self.request);
            }
            self.results=results;

            for (var i=0; i<results.length; i++) {
                // the first console
                console.log(results[i]);
                // add some items to the queue
                q.push(results[i], function (results) {
                     results[i]=results;
                     self.results[i]=results;
                                    //the second console.
                    console.log(results);
                });
            }
            if (results.length==0) {
                return proceed(true, results, request);
            }  
        });

Выход из вышеприведенного кода:

// the first console
{ cardid: 30,
  cardtype: 'I',
  status: 'A',
  refername: 'admin',
  refertype: 'U' }
// the second console 
{ '1': [Circular],
  cardid: 30,
  cardtype: 'I',
  status: 'A',
  refername: 'admin',
  refertype: 'U',
  user:
   { name: 'admin',
     username: 'admin',
     deleted: 'N' } }

как добавить '1': [Circular],.?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Этот бит:

q.push(results[i], function (results) {

такой же, как этот (с некоторым переименованием, чтобы упростить отслеживание области действия):

q.push(self.results[i], function(r) {
    r[i] = r; // <------------------- Look at me!
    self.results[i] = r;
    //the second console.
    console.log(r);
});

Изменение self.results[i] просто приходитот self.results=results; прямо над вашей for петлей.Интересная часть такова:

    r[i] = r;

Если i равен 1, вы добавите свойство с именем 1 к r, значение которого равно r, следовательно, [Circular].Я бы рискнул предположить, что results.length равен 2 и что ваша функция действует как замыкание над i и в итоге использует последнее значение, которое было i, и поэтому вы получаете '1' вместо '0' property.

Я вижу три основных вещи, которые могут доставить вам неприятности:

  • Классическая проблема закрытия с i.
  • Слишком много вещей былоназывается results, поэтому было легко потерять связь с тем, с кем вы работали.
  • Круговая ссылка: r[i] = r;.

Еще один возможный источник путаницы заключается в том, что results и self.results - это один и тот же объект, но это может быть хорошо.

0 голосов
/ 25 августа 2011

Похоже, что это круговая ссылка, и console.log приглушает ее.Попробуйте сделать console.log(Object.keys(results['1'])); для получения дополнительной информации о том, что находится внутри объекта 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...