2011-08-25 41 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); 
      } 
     }); 

該出把上面的代碼添加爲:

// 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],是如何被添加?

回答

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'而不是'0'屬性。

我看可能會造成你的麻煩三個主要方面:

  • 經典的封閉問題i
  • 太多的東西被稱爲results所以很容易失去跟蹤你正在使用哪一個。
  • 通函編號:r[i] = r;

另一個可能的混淆來源是resultsself.results是相同的對象,但可能沒問題。

+0

with ref。到答案我改變q.push(結果[I]中,函數(r)的{ \t \t \t \t \t結果[I] = R; \t \t \t \t \t self.results [I] =結果[I]; \t \t \t \t});現在它正在工作 – XMen

+0

@Rahul:酷,而'i'結束了正確的價值?我問,因爲我不確定何時該函數會被調用。 –

+0

是的輸出是正確的,m使用https://github.com/caolan/async#queue隊列在這裏 – XMen

0

似乎它是一個循環引用,console.log正在消除它。嘗試做console.log(Object.keys(results['1']));的詳細信息,在物體內部有什麼1