javascript -

  显示原文与译文双语对照的内容

web应用程序使用'长轮询'方法来保持最新数据与来自服务器的最新数据。 服务器只有在有新数据的时候才响应,这可能需要几分钟。 ( 这是一个加热控制系统,在室温变化或者有人更改设置时,你只能看到更新) 。


var version ="0";


function updater() {


 $.ajax({


 type:"POST",


 url:"/listen",


 data: version,


 success: function (data) {


 version = handleUpdates(data);


 updater();


 },


 error: function () {


 setTimeout(updater, 1000);


 }


 });


}



它在桌面浏览器和手机上都能正常工作,除了。 我发现在 Chrome 手机上有一些奇怪的事情发生在电话睡眠的时间为 10分钟之后。 这个邮件请求似乎被删除了,我猜自从电话睡眠的时候,我觉得是合理的。 在调试器选项卡的Chrome 网络中,POST请求的状态文本表示( 已经取消) 。

问题是当我在请求被取消时唤醒电话,success() 或者 error() 函数都被调用,我的网络应用程序不会被更新。 的$.ajax() 会打破它的承诺来给我回电话。

这个问题只在一些设备上发生。 我已经通过向朋友借用设备来做一些特殊的测试。 到目前为止,我只看到了android手机上的问题。 但手机连充电器都没有。 我在任何平板电脑上,苹果设备或者 Windows 电脑上都没有看到它。

我尝试在ajax设置中添加超时:


 timeout: 120 * 1000,



这有助于 error() 函数最终在唤醒后被唤醒到 2分钟。 但我希望用户在 1秒或者 2秒内看到更新。 我不想让超时这么短,因为它会造成不必要的服务器流量。

我还试图检测设备是否正在睡眠,因为在中查找的第二个ipqos是否可以检测到计算机恢复。? 我检测到唤醒后,我就会重新开机,然后开始另一个。 这在大多数情况下有助于。 但结果是不可靠的。 有时,时间事件在睡眠期间总是保持正常状态,而post请求会被取消。 它并不像一个可靠的修复。

我正在使用最新版本的jQuery: ( 2.1.2 ) 和 Chrome ( 47 ) 。

时间: 原作者:

我不确定这是否有效,我现在不能测试,但试试


$(window).focus(function() {


 updater();


});



原作者:

当手机进入睡眠状态时,我在过去有问题,JavaScript呼叫被挂起。 我最终使用的解决方案是使用似乎挂起的window.setInterval(),但是当电话被唤醒时,回到生活中来。

所以我建议设置一个间隔来取消频繁调用和 reinitiates 。 这可以帮助它通过电话睡眠。

类似于:


var myCall = $.ajax({...});



Window.setInterval (refreshCall(), 10000);



function refreshCall (){


 myCall.abort ();


 myCall = $.ajax({...});


}



原作者:

如何使用更高级别的监视功能:


var restartTimer = null;


function updater(){


 $.ajax({


 type:"POST",


 url:"/listen",


 data: version,


 success: function (data) {


 version = handleUpdates(data);


 clearTimeout(restartTimer);


 updater();


 },


 error: function () {


 clearTimeout(restartTimer);


 setTimeout(updater, 1000);


 }


 });


}


//Kick it when the phone wakes up.


$(window).focus(function(){


 restartTimer = setTimeout(function(){


 initializeAll();


 }, 6000);


 updater();


});



你知道,当电话唤醒时,$(window).focus 将会发生火灾,所以你尝试 updater() 作为 Almis,但是安全计时器。 如果更新器触发( 在 笔记本 或者iOS上),则计时器被取消,但是如果更新安全,则失败安全计时器将在 6秒内启动。

原作者:

如果 setInterval 存储它被调用的时间,然后比较上次调用的时间,然后将最近一次运行的时间设置为1 秒,则可以假定你刚刚从睡眠中唤醒? 然后中止当前的ajax调用,然后重新启动。

原作者:

最好的答案是"别这样"。 服务器正在跟踪服务器端的更改时,你正在等待响应。 只要让服务器响应,并在一段时间内拥有 jQuery 。 如果没有状态更改,可以包括lastChanged或者更改,但是如果服务器在任何情况下都做出响应。


setInterval(function () { 


 $.post({"/listen", version, function (data) {


 if(data.haschanged)


 version = handleUpdates(data);


 }).fail(function () {


//any error correction on failed call


 });


}, 1000);



...