这是不好的回调练习吗?

Sid*_*ebp 2 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);
            });
    };
Run Code Online (Sandbox Code Playgroud)

然后我这样称呼它:

 utilities.getTweets("TESTUSER", 4, function (tweets) {
                .....
             });
Run Code Online (Sandbox Code Playgroud)

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

Aln*_*tak 10

你正在做的事情大多都很好,除了没有必要创造额外的封闭.传递一个如下的封口:

function (data) {
      callBack(data);
}
Run Code Online (Sandbox Code Playgroud)

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);
    });
};
Run Code Online (Sandbox Code Playgroud)

然后在客户端代码中:

utilities.getTweets(user, maxTweets).done( /* your callback here */ );
Run Code Online (Sandbox Code Playgroud)

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

注意:使用data上面的地图也可以保护您的代码不受参数注入的影响.