2010-08-17 79 views
38

找出特定$.ajax()请求花了多长时间的好方法是什么?了解Ajax请求花了多长时间完成

我想获得这些信息,然后将它显示在某个页面上。

答案?? ::::

我是新来的JavaScript,这是我能想出如果你不想内联“成功”的功能最好的(因为它将是一个更大的功能)这是否是一个很好的方法来做到这一点?我觉得我过于复杂的东西...:

makeRequest = function(){ 
    // Set start time 
    var start_time = new Date().getTime(); 

    $.ajax({ 
     async : true, 
     success : getRquestSuccessFunction(start_time), 
    }); 
} 

getRquestSuccessFunction = function(start_time){ 
    return function(data, textStatus, request){ 
     var request_time = new Date().getTime() - start_time; 
    } 
} 
+0

http://stackoverflow.com/questions/1188195/ajax-jquery-response-的可能的复制时间表现部件 这种方式没有得到回答。 – Wolph 2010-08-17 00:44:21

+0

@沃尔夫链接的问题已被标记为这个问题的重复。我不明白这怎么可能。 – www139 2015-12-26 14:23:40

+0

这是一个很棒的问题! – www139 2015-12-26 14:24:09

回答

40

Codemeit是正确的。他的解决方案看起来像使用jQuery作为ajax请求的以下内容。这会以毫秒为单位返回请求时间。

var start_time = new Date().getTime(); 

jQuery.get('your-url', data, 
    function(data, status, xhr) { 
     var request_time = new Date().getTime() - start_time; 
    } 
); 
+1

我是新来的JavaScript。这会使用一个独特的start_time变量,还是会被异步请求覆盖? – 2010-08-17 02:39:00

+2

这不适用于多个请求,downvoting – Anonymous 2017-03-11 02:25:37

+0

您需要创建一个请求数组,在ajax的beforeSend()函数中push start_time - 然后在success()函数中计算时间差。 – Ross 2017-11-24 12:09:29

4

你可以设置开始时间为var,并计算完成AJAX操作时的时间差。

您可以利用Firefox插件Firebug检查AJAX请求和响应的性能。 http://getfirebug.com/或者你可以利用查尔斯代理或提琴手嗅探流量,看看表现等。

9

由于javascript使用的是event queue,因此无法给出准确的计时。这意味着你的程序可以执行这样的:

  • 开始AJAX请求
  • 处理等待鼠标点击事件/任何其他等待的代码行其间
  • 开始处理AJAX准备响应

不幸的是,据我所知,没有办法让事件被添加到队列中。 Event.timeStamp返回事件从队列中弹出的时间,请参阅此小提琴:http://jsfiddle.net/mSg55/

HTML:

<a href="#">link</a> 
<div></div> 

的Javascript:

$(function() { 
    var startTime = new Date(); 
    $('a').click(function(e) { 
     var endTime = new Date(e.timeStamp); 
     $('div').append((endTime - startTime) + " "); 
     //produce some heavy load to block other waiting events 
     var q = Math.PI; 
     for(var j=0; j<1000000; j++) 
     { 
      q *= Math.acos(j); 
     } 
    }); 

    //fire some events 'simultaneously' 
    for(var i=0; i<10; i++) { 
     $('a').click(); 
    } 
}); 
6

亚里士多德是对有关事件的队列。你可以做的是将你的时间戳创建放入你知道将尽可能接近AJAX请求开始的代码段。

当前稳定版本的jQuery(写作时:2.2.2)有一个接受函数的beforeSend键。我会在那里做。

请注意,在程序启动后,在JavaScript中,所有声明为以外的函数的全局作用域变量都将被初始化。了解JavaScript范围将在这里帮助。

棘手的部分是访问您在success回调中的beforeSend函数中声明的变量。如果您在本地声明它(使用let),则无法在该函数的范围之外轻松访问它。

下面是这将给稍微更准确的结果为例(警告:在大多数情况下),这也是危险,因为它宣布全球范围变量(start_time),这可能与其他脚本严重相互作用相同的页面等。

我很想深入JavaScript的原型bind函数的世界,但它有点超出范围。这是一个备用答案,小心使用,并在生产之外使用。

'use strict'; 
$.ajax({ 
    url: url, 
    method: 'GET', 
    beforeSend: function (request, settings) { 
     start_time = new Date().getTime(); 
    }, 
    success: function (response) { 
     let request_time = new Date().getTime() - start_time; 
     console.log(request_time); 
    }, 
    error: function (jqXHR) { 
     console.log('ERROR! \n %s', JSON.stringify(jqXHR)); 
    } 
]); 
+0

如果在节点前面加上'GLOBAL.'的全局声明。再次......做**不** **在任何地方使用这个产品! – GrayedFox 2016-04-15 13:25:04

7

这是正确的做法。

$.ajax({ 
    url: 'http://google.com', 
    method: 'GET', 
    start_time: new Date().getTime(), 
    complete: function(data) { 
     alert('This request took '+(new Date().getTime() - this.start_time)+' ms'); 
    } 
}); 

https://jsfiddle.net/0fh1cfnv/1/

+0

这正是我所寻找的,谢谢。 – blackandorangecat 2017-04-21 12:11:15

+0

'start_time'在某种程度上与ajax特殊/相关,或者你可以简单地在ajax对象内声明任何你喜欢的键吗?如果这真的很酷,我没有想到......! – GrayedFox 2017-07-19 12:05:23

+0

也有一些保证这里事件队列明智吗?我的意思是 - 我们知道以这种方式声明'start_time'实际上会将该变量初始化为请求开始之前的指令,或者在请求开始之前有一些其他事情可能潜入队列中结果结果)? – GrayedFox 2017-07-19 12:09:50

0
makeRequest = function(){ 

    // Set start time 
    console.time('makeRequest'); 

    $.ajax({ 
     async : true, 
     success : getRquestSuccessFunction(start_time), 
    }); 
} 

getRquestSuccessFunction = function(start_time){ 

    console.timeEnd('makeRequest'); 

    return function(data, textStatus, request) { 

    } 
} 

这给在mseconds 像makeRequest的输出:1355.4951171875ms