这是不好的回调练习吗?

时间:2011-12-31 13:19:14

标签: javascript jquery

我对JavaScript比较陌生,并且反复发现自己在一个辅助对象中编写方法,该方法将回调作为一个参数,例如。

var utilities = {
    getTweets: function (user, maxTweets, callBack) {
            var obj = $(this);
            $.getJSON('http://api.twitter.com/1/statuses/user_timeline.json?callback=?&screen_name=' + user + "&count=" + maxTweets, function (data) {
                callBack(data);
            });
    };

然后我这样称呼它:

 utilities.getTweets("TESTUSER", 4, function (tweets) {
                .....
             });

鉴于我使用setInterval调用上面的代码,这可能会随着时间的推移而泄漏/是否有更好的方法来编写它?

3 个答案:

答案 0 :(得分:10)

你所做的一切都很好,除了没有必要创造额外的封闭。传递一个如下的封口:

function (data) {
      callBack(data);
}

与直接在参数列表中传递callBack相同。

但是,如果您可以保证使用jQuery 1.5或更高版本运行,那么更好的方法是让getTweets()返回JQXHR对象,然后您可以在客户端代码中使用“延迟”方法:

var utilities = {
    getTweets: function (user, maxTweets) {
        var uri = 'http://api.twitter.com/1/statuses/user_timeline.json?callback=?';
        var data = {
            screen_name: user,
            count: maxTweets
        };
        return $.getJSON(uri, data);
    });
};

然后在客户端代码中:

utilities.getTweets(user, maxTweets).done( /* your callback here */ );

通过这种方式,您可以完全将回调与实现分离。实际上,您可以注册多个回调和错误处理程序,所有这些都不会触及utilities的实现。

注意:使用上面的data地图也可以保护您的代码免受参数注入。

答案 1 :(得分:1)

如果您害怕每次创建该函数所带来的内存开销,那么请执行以下操作:

utilities.getTweets("TESTUSER", 4, utilities.handleTweets);

utilities.handleTweets中,您可以像回调一样进行操作。

答案 2 :(得分:-2)

您可以使用以下内容:

var utilities = {
    options: {
         user: 'value',
         maxTweets: '4'
    }
    getTweets: function() {
        // access a value
        this.options.user;
    }
}

或者最好使用选项等创建一个合适的插件。阅读本文,它应该是您所需要的:

http://jquery-howto.blogspot.com/2009/01/how-to-set-default-settings-in-your.html