从对象内部的异步回调中调用函数

时间:2013-09-27 09:14:53

标签: javascript node.js asynchronous

我有这段代码:

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

2 个答案:

答案 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();

}