这是糟糕的回调练习
Is this bad callback practice?
我对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相关文章:
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 将json回调数据转换为日期
- 承诺在非节点式回调上使用Bluebird
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- 如何使用jqueryAJAX从页面中回调多个变量
- jquery Onclick函数带有导致双击的回调排序函数
- Javascript点击事件回调不起作用
- 一旦加载并渲染了角度引导typeahead,就使用回调
- 成功回调永远不会被JSONP请求调用
- 如何让程序员在javascript中实现正确的回调
- 这是糟糕的回调练习