我是一个相对较新的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上面的地图也可以保护您的代码不受参数注入的影响.