Fra*_*bot 22 javascript ajax jquery asynchronous
这篇文章最近登上了HackerNews的顶部:http://highscalability.com/blog/2013/9/18/if-youre-programming-a-cell-phone-like-a-server-youre-doing.html#
其中声明:
电池收音机是手机上最大的电池电量之一.每次发送数据时,无论多小,收音机都会通电20-30秒.您做出的每一个决定都应该基于最小化无线电启动的次数.通过更改应用处理数据传输的方式,可以显着提高电池寿命.用户现在需要他们的数据,诀窍是平衡用户体验与传输数据和最小化电源使用.通过小心地将所有重复和间歇传输捆绑在一起然后积极地预取间歇传输的应用程序来实现平衡.
我想修改$.ajax补充,如"并不需要做一个选择,现在,只是做这个请求时,另一个请求启动".有什么好办法可以解决这个问题?
我从这开始:
(function($) {
var batches = [];
var oldAjax = $.fn.ajax;
var lastAjax = 0;
var interval = 5*60*1000; // Should be between 2-5 minutes
$.fn.extend({batchedAjax: function() {
batches.push(arguments);
}});
var runBatches = function() {
var now = new Date().getTime();
var batched;
if (lastAjax + interval < now) {
while (batched = batches.pop()) {
oldAjax.apply(null, batched);
}
}
}
setInterval(runBatches, interval);
$.fn.ajax = function() {
runBatches();
oldAjax.apply(null, arguments);
lastAjax = now;
};
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
我不能通过论文的措辞来判断,我猜一个好的批次"间隔"是2-5分钟,所以我只用了5.
这是一个很好的实现吗?
如何ajax通过向方法添加{batchable:true}选项,使其成为方法的真正修改?我也没想出来.
是否setInterval也一直保持手机清醒?这是件坏事吗?有没有更好的方法不这样做?
这里有其他东西会导致电池更快耗尽吗?
这种方法是否值得?在现代智能手机中,有很多事情一次发生,如果我的应用程序没有使用单元格,肯定还有其他应用程序.Javascript无法检测到单元格是否打开,为什么还要麻烦?值得打扰吗?
我在添加选项方面取得了一些进展$.ajax,开始编辑问题,并意识到它更好的答案:
(function($) {
var batches = [];
var oldAjax = $.fn.ajax;
var lastAjax = 0;
var interval = 5*60*1000; // Should be between 2-5 minutes
var runBatches = function() {
var now = new Date().getTime();
var batched;
if (lastAjax + interval < now) {
while (batched = batches.pop()) {
oldAjax.apply(null, batched);
}
}
}
setInterval(runBatches, interval);
$.fn.ajax = function(url, options) {
if (options.batchable) {
batches.push(arguments);
return;
}
runBatches();
oldAjax.apply(null, arguments);
lastAjax = now;
};
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
这实际上相当简单.爱是不是要看到更好的答案.
- setInterval是否也一直让手机保持清醒状态?这是件坏事吗?有没有更好的方法不这样做?
从iPhone 4,iOS 6.1.0 Safari环境:
A写了一个带有倒数计时器的应用程序,它以一秒的间隔更新元素的文本.DOM树具有中等复杂性.该应用程序是一个相对简单的计算器,没有做任何AJAX.然而,我总是怀疑那些每秒一次的回流正在扼杀我.我的电池肯定似乎以相当快耗尽,每当我离开它开启的桌子上,用Safari浏览器上的应用程序的网页.
该应用程序只有两次超时.现在,我没有任何可以量化的证据证明超时正在耗尽我的电池电量,但是从这个愚蠢的计算器每45分钟损失大约10%是有点令人不安的.(谁知道,也许是背光.)
在这方面:您可能想要构建一个测试应用程序,按时间间隔执行AJAX,其他时间间隔等,并比较每个功能在类似条件下如何耗尽电池.获得受控环境可能会很棘手,但如果排水量存在足够大的差异,那么即使是"不完美"的测试条件也会产生足够明显的结果,您可以得出结论.
但是,我发现iOS 6.1.0 Safari处理超时的方式很有趣:
如果我的应用程序的计时器显示正确的时间(即使在我关闭并重新打开屏幕后),那么我就无法轻松完成secondsLeft -= 1.如果我关闭了屏幕,那么secondsLeft(相对于我的开始时间)就会"落后",因而不正确.(屏幕关闭时,setTimeout回调未运行.)
解决方案是我必须timeLeft = fortyMinutes - (new Date().getTime() - startTime)在每个间隔重新计算.
此外,我的应用程序中的计时器应该从绿色,石灰,黄色变为红色,因为它接近到期.因为在这一点上,我担心我的间隔码的效率,我怀疑在适当的时间"安排"我的颜色变化会更好(石灰:开始时间后20分钟,黄色:30分钟,红色:35)(这似乎比每次间隔的四重不等式检查更好,这在99%的时间里都是徒劳的).
但是,如果我安排了这样的颜色更改,并且我的手机屏幕在目标时间关闭了,那么这种颜色变化将永远不会发生.
解决方案是在每个间隔检查自上次1秒计时器更新以来经过的时间是否为" >= 2秒".(通过这种方式,应用程序可以知道我的手机是否关闭了屏幕;它能够意识到它何时"落后".)此时,如果有必要,我会"强行"应用颜色更改和时间表下一个.
(不用说,我后来删除了换色器...)
所以,我相信这证实了我的主张
如果屏幕关闭,iOS 6.1.0 Safari不会执行setTimeout回调函数.
因此,在"调度"您的AJAX调用时请记住这一点,因为您可能也会受到此行为的影响.
并且,使用我的命题,我可以回答你的问题:
- 这种方法是否值得?在现代智能手机中,有很多事情一次发生,如果我的应用程序没有使用单元格,肯定还有其他应用程序.Javascript无法检测到单元格是否打开,为什么还要麻烦?值得打扰吗?
如果你能得到这个实现正常工作,那么现在看来似乎会是值得的.
对于您所做的每个AJAX请求,都会产生延迟,这会在一定程度上降低您的应用程序的速度.(毕竟,延迟是页面加载时间的祸根.)所以你肯定会通过"捆绑"请求获得一些收益.扩展$ .ajax以便您可以"批量"请求肯定会有一些优点.
您链接的文章显然侧重于优化应用程序的功耗(是的,天气小部件示例令人恐惧)。根据定义,主动使用浏览器是一项前台任务;另外,像ApplicationCache这样的东西已经可以用来减少对网络请求的需求。然后,您可以根据需要以编程方式更新缓存并避免 DIY。
持怀疑态度的旁注:如果您使用 jQuery 作为 HTML5 应用程序的一部分(可能封装在 Sencha 或类似的应用程序中),那么移动应用程序框架可能比代码本身更多地与请求优化有关。我没有任何证据,但该死的,这听起来是对的:)
- 如何
ajax通过向{batchable:true}方法添加选项来真正修改方法?我也没有完全弄清楚。
这是一个完全有效的方法,但对我来说,这听起来像是鸭子拳击出了问题。我不会。即使您正确地默认batchable为 false,我个人也宁愿使用外观(也许甚至在它自己的命名空间中?)
var gQuery = {}; //gQuery = green jQuery, patent pending :)
gQuery.ajax = function(options,callback){
//your own .ajax with blackjack and hooking timeouts, ultimately just calling
$.ajax(options);
}
Run Code Online (Sandbox Code Playgroud)
setInterval手机也一直保持唤醒状态吗?这是一件坏事吗?有没有更好的方法不这样做?
setInterval和的本机实现setTimeout非常相似;据我所知;考虑到当网站处于网上银行不活动提示的后台时,后者不会触发;当页面不在前台时,其执行基本上停止。如果有一个 API 可用于此类“延迟”(本文提到了一些相关的 iOS7 功能),那么它可能是一种更好的方法,否则我认为没有理由避免setInterval.
- 这里是否还有其他因素会导致电池消耗得更快?
我推测任何重负载都会(pi可能从计算到漂亮的 3D 转换)。但这对我来说听起来像是过早的优化,让我想起了带有省电模式的电子阅读器,它完全关闭了液晶屏:)
- 这种方法值得吗?现代智能手机中同时发生的事情太多了,如果我的应用程序没有使用该单元,那么肯定有其他应用程序正在使用该单元。JavaScript 无法检测单元格是否打开,那为什么还要麻烦呢?值得烦恼吗?
这篇文章指出天气应用程序过于贪婪,这让我感到担忧。这似乎是一种开发疏忽,但比其他任何事情都重要,因为获取数据的频率超过了实际需要的频率。在理想的情况下,这应该在操作系统级别得到很好的处理,否则您最终会得到一系列相互竞争的解决方法。IMO:在 highscalability 发布另一篇文章告诉你之前不要打扰:)
| 归档时间: |
|
| 查看次数: |
845 次 |
| 最近记录: |