2014-11-20 64 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