2014-11-20 137 views
0

我需要一种测量JavaScript函数的响应时间的方式来创建一个http请求,其中包括该http请求的响应时间。然而,我无法修改该功能。性能的Javascript功能,使HTTP请求

这里就是我想要做的事:

var startTime = performance.now(); //log start timestamp 
foo.bar(); //The Function that generates an HTTP request 
var endTime = performance.now(); //log end timestamp 
var diffTime = endTime - startTime; 

但只捕获需要的功能来生成请求的时间。有没有一种方法来捕获在javascript中生成请求的响应时间?

+0

是用jQuery的AJAX或生成您的HTTP请求。后/获取?如果是这样,请在回调中调用performance.now。 – RobertoNovelo 2014-11-20 21:32:28

+0

虽然我无权修改该功能。有没有解决方法? – Alanpep 2014-11-20 21:41:04

+0

你有没有注册任何回调函数? – RobertoNovelo 2014-11-20 21:42:35

回答

1

您必须检查请求回调中的时间戳。

编辑:

如果你想要做(所以只是通过增加另一个js文件),从应用程序完全独立测量这一点,我想你可以装饰的XMLHttpRequest。

window.XMLHttpRequest = function() {...} 

您的包装将需要具有相同的API,以便应用程序仍然有效,并且还可以在内部测量性能。

+0

有没有办法通过JavaScript来提取? – Alanpep 2014-11-20 21:09:08

+0

我不确定你的意思。为了澄清,您需要修改示例中foo.bar函数的代码。我假设你在那里发送请求。您附加的获取响应的函数必须包含用于检查请求的endTime的代码。 – pablochan 2014-11-20 21:15:02

+0

好,谢谢,让我澄清一下。我没有权限修改foo.bar函数,它不属于我。我正在寻找一种方法来捕获所需的通话并找到响应时间。有没有办法在不修改foo.bar的情况下捕获响应? – Alanpep 2014-11-20 21:37:02

0

我通常会打F12,在任何浏览器上打开开发工具,进入网络选项卡,然后查看正在制作的ajax调用,它会告诉您多长时间的请求和静音所带来的非常细节细节。但是,如果您正在考虑使用ajax调用的java脚本,请在调用之前启动计时器,并在ajax调用的完整事件中停止它(将需要编辑该函数) 。如果它是异步的,这是捕捉它的唯一方法。根据你的描述,在这里猜测它实际上是一个异步调用,这就解释了函数的行为只是让ajax调用返回而不关心状态或响应...

0

如果你发生在你无法访问的功能被使用jQuery,你可以给这个一杆:

$.when(foo.bar()).done(function() 
{ 
    console.log("Fired after ajax request is done!"); 
}); 

看看还在:

var obj = { 
    promise: function() { 
    // do something 
    } 
}; 

$.when(obj).done(fn); 

var obj = { 
    promise: foo.bar() 
}; 

$.when(obj).done(callback); 

或退房这篇大文章http://www.erichynds.com/blog/using-deferreds-in-jquery

0

好了,如果你没有一个存取权限的功能,或者您不能编辑Ajax调用,您可以创建一个监听器。策略:

  1. 声明一个标志以前生产的HTTP请求调用
  2. 开始呼叫
  3. 开始侦听环每隔X毫秒,然后检查结束状态(阿贾克斯功能外,并在其后被称为)

你应该问自己:当这个调用结束时,哪种类型的变量会被改变?事件的UI视觉变化可以作为一个标志

,如果你想知道如何建立你的听众..它看起来是这样的:

function listener() 
{ 
    // do some checks here 

    if (done) 
    { 
     var endTime = performance.now(); //log end timestamp 
     var diffTime = endTime - startTime; 
    } 
    else 
    { 
     setTimeout(listener(), 100); 
    } 
} 
listener(); // activate the listener