为什么[循环]被添加到哈希中

时间:2011-08-25 06:53:27

标签: javascript node.js asynchronous

这是我的代码

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 个答案:

答案 0 :(得分:1)

这一位:

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}}而不是'1'属性。

我看到可能导致你麻烦的三件主要事情:

  • '0'的经典闭包问题。
  • 太多事情被称为i,所以很容易忘记你正在使用哪一个。
  • 循环引用:results

另一个可能的混淆源是r[i] = r;results是同一个对象,但可能没问题。

答案 1 :(得分:0)

好像它是一个循环引用,console.log正在消除它。尝试执行console.log(Object.keys(results['1']));以获取有关对象1

内部内容的更多信息