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