在对象内部调用asynchronouscallback函数
我有这个代码:
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);
问题是外部库可能会改变上下文(用.bind(this)
调用你的函数)。
您可以将对象存储在一个variables中,然后直接调用它
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; }
试试这个,不知道它是否有效
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(); }