0

我正在尝试使用带有私有动态调用函数的 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,在公共方法中将私有函数作为字符串调用,而不使用 eval(显示模式)

谢谢!

编辑:

这是我的新代码:

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/

4

3 回答 3

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();
于 2013-06-27T10:53:09.130 回答
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();

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

谢谢!

于 2013-06-27T10:53:50.993 回答
0

一个承诺需要被拒绝或解决。尝试deferred.resolve();并调用您的 done-Callback 。

当 Deferred 被解析时,任何由 deferred.then() 或 deferred.done() 添加的 doneCallbacks 都会被调用。

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

于 2013-06-27T10:39:06.927 回答