Утечка памяти в обещании - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь реализовать функцию, использующую promise, которая сначала ждет, а затем записывает некоторые строки, первое, что приходит на ум, это clearTimeout, когда я думаю о setTimeout, функция делает то, что я намереваюсь. Мой вопрос заключается в том, есть ли утечки памяти в созданном первоначальном обещании, которое когда-либо ожидалось, так как я очищаю timeId, поэтому он никогда не будет установлен.

Извините за мой плохой Engli sh и грязный код.

// Goodman
function Goodman(sbd) {
  let timeId

  let promise = new Promise(resolve => {
    timeId = setTimeout(() => resolve(console.log('I am ' + sbd)), 0)
  })

  let rest = function(ms) {
    this.promise.then(() => new Promise(resolve => setTimeout(resolve, ms)))
    return this
  }

  let learn = function(sth) {
    this.promise.then(() => console.log('Learning ' + sth))
    return this
  }

  let restFirst = function(ms) {
    clearTimeout(this.timeId)
    this.promise = new Promise(resolve => {
      this.timeId = setTimeout(resolve, ms)
    }).then(() => console.log('I am ' + sbd))
    return this
  }

  return {
    timeId,
    promise,
    rest,
    learn,
    restFirst
  }
}

// Initially wait 5 seconds
// "I am Tom"
// "Learning chinese"
Goodman('Tom')
  .restFirst(5000)
  .learn('chinese')

1 Ответ

1 голос
/ 10 апреля 2020

У меня вопрос, есть ли утечки памяти в созданном первоначальном обещании, которое когда-либо ожидалось, так как я очищаю timeId, поэтому оно никогда не будет установлено.

Нет, обещание, которое является никогда не разрешается и не отклоняется - это просто объект в Javascript, как и любой другой объект. Это будет сборщик мусора, когда больше не будет кода, который имеет ссылку на объект (когда он становится «недоступным»).

Помните, что обещания - это просто система уведомлений. Все они являются обычным Javascript объектом, который служит центром обмена информацией для слушателей успеха и сбоев и фиксированным значением успеха или причины сбоя для какого-либо события, которое завершается в будущем. Это просто объект с методами, похожими на любой другой объект. Когда они станут недоступными, в это время они будут собирать мусор, независимо от того, решены они, отклонены или ожидают решения.

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