使用具有私有动态调用函数的延迟对象(显示模式)

时间:2013-06-27 10:19:51

标签: javascript jquery function private deferred

我正在尝试将jQuery延迟使用私有动态调用函数,如下所示:

var module = (function(){
    var privateFuncs = {
        privateMethod: function(val) {
            console.log(val);
        }
    };

    var success = function() {
        console.log('Success');
    };

    var publicMethod = function() {
        var functionString = "privateMethod";
        privateFuncs[functionString]('test').done(function(){
           success();
        });
    };

    return {
        init: publicMethod
    };
})();

module.init();

我收到了这个错误:

privateFuncs[functionString](...) is undefined

http://jsfiddle.net/cbelizon/pTaze/1/

有没有机会实现我正在寻找的目标?

如果不使用延迟对象,代码就像魅力一样,你可以在这里看到:

JavaScript, call private function as a string inside public method without using eval (Revealing pattern)

谢谢!

编辑:

这是我的新代码:

var module = (function(){
    var privateFuncs = {
        privateMethod: function(val) {
            console.log(val);
        }
    };

    var success = function() {
        console.log('Success');
    };

    var publicMethod = function() {
        var functionString = "privateMethod";
        var deferred = $.Deferred(privateFuncs[functionString]('test'));
        deferred.done(function(){
           success();
        });
    };

    return {
        init: publicMethod
    };
})();

module.init();

问题是当我创建延迟对象时没有任何反应,请看这里:

http://jsfiddle.net/cbelizon/pTaze/3/

3 个答案:

答案 0 :(得分:1)

这不正确使用jQuery.Deferred:

var module = (function(){
    var privateFuncs = {
        privateMethod: function(val) {
            console.log(val);
        }
    };

    var success = function() {
        console.log('Success');
    };

    var publicMethod = function() {
        var functionString = "privateMethod";
        var deferred = $.Deferred(function(defer) {
            privateFuncs[functionString]('test');
            defer.resolve()
        });
        deferred.done(function(){
           success();
        });
    };

    return {
        init: publicMethod
    };
})();

module.init();

答案 1 :(得分:0)

承诺需要被拒绝或解决。尝试deferred.resolve();,应该调用你的完成回调。

  

解决Deferred后,添加任何doneCallbacks   调用deferred.then()或deferred.done()。

来源:http://api.jquery.com/deferred.resolve/

答案 2 :(得分:0)

我终于完成了我的目标:

以下是解决方案:

var module = (function(){
    var privateFuncs = {
        privateMethod: function(val) {
            alert(val);
        }
    };

    var success = function() {
        alert('Success');
    };

    var publicMethod = function() {
        var functionString = "privateMethod";
        var deferred = $.Deferred();
        deferred.resolve(privateFuncs[functionString]('test'));
        deferred.done(function(){
           success();
        });
    };

    return {
        init: publicMethod
    };
})();

module.init();

我误解了延迟对象的使用及其状态。

谢谢!