我有这段代码:
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 :(得分: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;
}
答案 1 :(得分: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();
}