带有硬编码的解析时间的多余延迟

时间:2018-12-17 20:44:14

标签: javascript asynchronous time promise

我尝试以编程方式计算请求数-响应时间,并最终获得以下代码:

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毫秒来自哪里:

  1. 原因是new Date().getTime()的执行时间。 (但如果是这样,为什么我们在2000年和2003年之间会得到不同的结果,为什么每次执行时的结果都不一样?)。

  2. 原因是请求的异步性质,即使它具有硬编码的解决时间。

  3. 还有其他事情。

  

我想听听您的想法,并找到一种方法来获得真实的响应时间(在这种情况下为2秒)。

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是准确的(或者如果您不模拟请求),您仍然不会获得准确的结果。而且没有办法。实际上,我看不出为什么毫秒会很重要。