2011-08-25 11 views
0
ここ

私のコードはなぜ[円]であるハッシュ

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); 
      } 
     }); 

アウトは、上記のコードを入れているに追加取得されています。この'1': [Circular],が追加されますどのように

// 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

何の詳細については、console.log(Object.keys(results['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]変更はforループのすぐ上にあるself.results=results;からの変更です。興味深い部分はこれです:

r[i] = r; 

iが1である場合は、それゆえ[Circular]、その値そのものrあるr1という名前のプロパティが追加されています。私はresults.lengthが2であり、あなたの関数がiを超えるクロージャーとして機能し、最後にiという値を使用して終了していると推測しているので、'0'プロパティではなくが得られます。 i

  • 古典的な閉鎖問題:

    は、私はあなたにトラブルを引き起こしている可能性があり3つの主なものを参照してください。
  • あまりにも多くのものがresultsと呼ばれていたので、どちらがあなたと作業していたのかを簡単に追跡できませんでした。
  • 循環参照:r[i] = r;

もう1つの考えられる原因は、resultsself.resultsは同じオブジェクトですが、問題はない可能性があります。

+0

\t \t \t \t \t self.results [I] =結果[I];あなたの答えに私はq.push(結果[i]は、関数(R){ \t \t \t \t \t結果[I] = R変更しました \t \t \t \t});それは今働いています – XMen

+0

@Rahul:クール、 'i'は正しい値で終わりますか?私はその機能がいつ呼び出されるのか分からないので尋ねる。 –

+0

出力が正しく表示されています。ここでhttps://github.com/caolan/async#queueキューを使用しています – XMen

0

循環参照のようであり、console.logはそれを消音しているようです。このビットオブジェクト内1

関連する問題