我尝试以编程方式计算请求数-响应时间,并最终获得以下代码:
function fakeRequest(wait) {
return new Promise(resolve => {
setTimeout(() => resolve(wait), wait);
});
}
function calculateTime(fn, params) {
const startTime = new Date().getTime();
fn(...params)
.then(response => {
const endTime = new Date().getTime();
const requestTime = endTime - startTime;
console.log(`
Request should take ${response} ms
Request took ${requestTime} ms
`);
});
}
calculateTime(fakeRequest, [2000]);
在此示例中,我们对解决时间进行了硬编码(2000毫秒),据我所知,最终结果应该是相同的-2秒。但是,当我在计算机上运行此代码时,它在 2000ms 和 2003ms 之间给了我不同的结果。
我试图找出这3毫秒来自哪里:
原因是new Date().getTime()
的执行时间。 (但如果是这样,为什么我们在2000年和2003年之间会得到不同的结果,为什么每次执行时的结果都不一样?)。
原因是请求的异步性质,即使它具有硬编码的解决时间。
还有其他事情。
我想听听您的想法,并找到一种方法来获得真实的响应时间(在这种情况下为2秒)。
答案 0 :(得分:1)
虽然Felix是正确的,因为setTimeout
无法保证确切的回调时间,但是您的代码中有一些注意事项。您没有尽早计算结束时间(解决之后)。我的测试距离下面的期望时间略近一些。我的观点是,即使您的setTimeout 是准确的,我也不认为您的日志是正确的。
var closeEnd
function fakeRequest(wait) {
return new Promise(resolve => {
setTimeout(() => {
closeEnd = performance.now()
resolve(wait)
}, wait);
})
}
function calculateTime(fn, params) {
const startTime = performance.now()
console.log(startTime)
fn(...params)
.then(response => {
const requestTime = closeEnd - startTime;
console.log(`
Request should take ${response} ms
Request took ${requestTime} ms
`);
});
}
calculateTime(fakeRequest, [2000]);
答案 1 :(得分:1)
如果将setTimeout(resolve, wait, wait)
替换为resolve(wait)
,您将获得〜5ms。那可能是由于两件事:
1)Date.now()
返回的时间不准确。
2)承诺始终以异步方式解决,因此直到下一个引擎滴答声为止都有很小的延迟。
因此,即使setTimeout
是准确的(或者如果您不模拟请求),您仍然不会获得准确的结果。而且没有办法。实际上,我看不出为什么毫秒会很重要。