这是糟糕的回调练习

Is this bad callback practice?

本文关键字:回调 练习      更新时间:2023-09-26

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

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调用上面的代码,这可能会随着时间的推移而泄漏/是否有更好的方法来写这个?

您所做的大部分都很好,除了不需要创建额外的闭包。传递一个像这样的闭包:

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映射也可以保护你的代码免受参数注入。

如果您担心每次创建该函数的内存开销,那么可以这样做:

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

utilities.handleTweets中你做你在回调中做的。

你可以这样写:

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