2013-09-27 69 views
1

內從異步的回調中的函數我有這樣的代碼:調用對象

var async = require("async"); 

module.exports = function(vars){ 

    return { 

     a: function(){ 
      console.log("a()"); 
     }, 

     b: function(){ 

      var self = this; 

      async.series([ 
       function(callback){ 
        ... 
        callback(); 
       }, 
       function(callback){ 
        ... 
        callback(); 
       } 
      ], function(){ 
       self.a(); // <------- err 
      }); 
     } 

    } 
} 

然後我打電話給B中:

var test = require("./test.js")({}); 
test.b(); 

,但我得到這個錯誤:Object #<Object> has no method 'a'。爲什麼?

編輯:

對不起,這段代碼實際上運行良好,但我得到這個錯誤在我的生產代碼。

從這個例子唯一的區別是(正常工作)和我的代碼(不) 是我的演示代碼被直接調用:

var test = require("./test.js")({}); 
test.b(); 

,而我的生產代碼是從另一個庫調用:

var my_code = require("./something.js")({}); 
imap_notify.on_new_mail(my_code.my_func); 
+0

如何在方法'B'叫什麼名字? –

+0

@ArunPJohny檢查我的編輯,請 – alexandernst

+0

self = b在這個例子中 – Armand

回答

1

問題是外部庫可能會更改上下文(使用.bind(this)調用您的函數)。

您可以將對象存儲在一個變量,並直接調用它

module.exports = function(vars){ 

    var obj = { 

     a: function(){ 
      console.log("a()"); 
     }, 

     b: function(){ 

      // var self = this; // useless now 

      async.series([ 
       function(callback){ 

        callback(); 
       }, 
       function(callback){ 

        callback(); 
       } 
      ], function(){ 
       obj.a(); // <--- now it works 
      }); 
     } 

    }; 

    return obj; 
} 
+0

是的,這是解決方案:)無論如何,我想知道爲什麼我的方式失敗。 (我看不到「on_new_mail」函數中的任何綁定) – alexandernst

0

試試這個,不知道這是否是有效的,雖然

var async = require("async"); 

var Item = function(){ 
    self= this; 

    self.a= function(){ 
     console.log("a()"); 
    }, 

    self.b= function(){ 



     async.series([ 
      function(callback){ 
       ... 
       callback(); 
      }, 
      function(callback){ 
       ... 
       callback(); 
      } 
     ], function(){ 
      self.a(); // <------- err 
     }); 
    } 
} 



module.exports = function(){ 

    return new Item(); 

} 
+0

不是。 '這個'==='模塊'。 – Andy

+0

確實,這是無效的。 – alexandernst

+0

即使這是有效的,它並不會幫助將this存儲爲局部變量的想法允許在匿名函數中訪問它,而上下文不再是對象。 – Adam