如何快速检测本地服务缺席?

时间:2015-05-12 21:13:35

标签: javascript jquery cors

我有一个本地应用程序,其中包含一个用于与Web应用程序交换JSON的Web服务器。 Web应用程序本身是从Web提供的,这意味着浏览器将它们视为跨域。

当应用程序运行时,它提供正确的跨源头以允许交换。但是,我想要的是快速检测应用程序是否正在运行的选项。

目前的方法是将AJAX用于localhost服务上的“心跳”URL:

pg.init.getHeartbeat = function(port) {

    var url = pg.utils.baseUrl('heartbeat', port); // returns a localhost URL
    $.ajax({
      url: url,
      type: 'GET',
      async: true,
      success: function(data) {
        // Hooray! Application is there. Do 'hooray' stuff
      },
      error: function(data) {
        // Whoah the bus. Application not there. Do 'no application' stuff.
      }
    });
};

在Webkit中运行良好。 Webkit试图获得心跳,快速失败,并且很快就会失败。

问题出在Firefox中。 Firefox试图获得心跳,并且需要4到10秒才能失败。它可能看起来不是很多,但是在UI移动之前4秒,用户进入下一步就是让应用程序感觉非常缓慢且无响应。

还有其他想法吗?据我所知,更改iFrame的src属性并捕获失败也不起作用。它不会触发错误事件。即使我可以从示例代码中触发错误,它仍然需要4秒,因此没有净改进。

Web服务器端的东西不应该有任何服务器端脚本语言(PHP等);我需要JavaScript能够独立处理它。

1 个答案:

答案 0 :(得分:1)

如果导航器是Firefox,您可以暂停:

var timeoutcall = 0;
if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1)
{
     timeoutcall = 100;
}
     $.ajax({
          url: url,
          type: 'GET',
          timeout: timeoutcall ,
          async: true,
          success: function(data) {
            // Hooray! Application is there. Do 'hooray' stuff
          },
          error: function(data) {
            // Whoah the bus. Application not there. Do 'no application' stuff.
          }
        });

如果超时为0,则没有超时。所以,如果我在Firefox中,我将超时设置为100毫秒,如果我不在Firefox中设置为无限制。