Как правильно суммировать результаты обещания 2 JavaScript и вернуть результат в обещании? - PullRequest
0 голосов
/ 22 января 2020

У меня есть реализация, которая неправильно суммирует обещания 2 JavaScript и добавляет дополнительные. Ожидается, что я смогу вернуть 3, но возвращает 4. Есть ли что-то, чего мне не хватает?

const timeToCountMs = 100;

const countingStartTime = Date.now();

const count = () => new Promise((resolve) => setTimeout(resolve, timeToCountMs));

async function getFirstCount() {
  await count();

  return Math.round((Date.now() - countingStartTime) / 50);
}

async function getSecondCount() {
  await count();

  return Math.round((Date.now() - countingStartTime) / 100);
}

async function getTotalCount() {

  var firstCount = await getFirstCount();

  var secondCount = await getSecondCount();

  return new Promise(function(resolve, reject) {
    resolve(firstCount + secondCount);
  });
}

getTotalCount(); // results in 4, instead of 3

1 Ответ

3 голосов
/ 22 января 2020

getFirstCount возвращает Math.round((Date.now() - countingStartTime) / 50), запускается немедленно и разрешается через 100 мс, поэтому результат равен 2.

getSecondCount возвращает Math.round((Date.now() - countingStartTime) / 100), запускается один раз getFirstCount разрешает (то есть после 100 мс) и разрешает еще через 100 мс, что эквивалентно:

Math.round((Date.now() - countingStartTime) / 100)
Math.round((200 ) / 100)
Math.round(2)
2

Проверка countingStartTime, когда каждая из функций start выполняется вместо , а не в начале загрузки страницы. (Таким образом, разница между Date.now и countingStartTime будет фактически общим временем работы функции)

Кроме того, избегайте явной антипаттерна конструкции Promise - если вы находитесь в функции async Обещание уже будет возвращено по умолчанию, поверх этого нет необходимости строить new Promise:

const timeToCountMs = 100;
const count = () => new Promise((resolve) => setTimeout(resolve, timeToCountMs));
async function getFirstCount() {
  const countingStartTime = Date.now();
  await count();
  return Math.round((Date.now() - countingStartTime) / 50);
}

async function getSecondCount() {
  const countingStartTime = Date.now();
  await count();
  return Math.round((Date.now() - countingStartTime) / 100);
}

async function getTotalCount() {
  var firstCount = await getFirstCount();
  var secondCount = await getSecondCount();
  return firstCount + secondCount;
}

getTotalCount().then(console.log);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...