Skip to content

timers wrong behavior #24362

Closed
Closed
@twawszczak

Description

@twawszczak
  • Version: 11.1
  • Platform: Debian 7
  • Subsystem: timers

I have found another strange behavior of timers after refactor in v11. Example:

setTimeout(() => {
  console.log('firing', 11000)
}, 11000)

setTimeout(() => {
  console.log('firing', 90000)
}, 90000)

setInterval(() => {
  console.log('firing', 1000)
}, 1000)

const timer4000 = setTimeout(() => {
  console.log('firing', 4000)
}, 4000)

setTimeout(() => {
  console.log('firing', 60000)
}, 60000)

setTimeout(() => {
  console.log('firing', 100)

  const timer1500 = setTimeout(() => {
    console.log('firing', 1500)
  }, 1500)
  clearTimeout(timer1500)

}, 100)

setTimeout(() => {
  console.log('firing', 3000)
}, 3000)

clearTimeout(timer4000)

setTimeout(() => {
  console.log('firing', 16000)
}, 16000)

It is a bit complicated, but when i am removing any part, it works as expected. An output:

firing 100
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 11000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 16000
firing 1000
firing 1000
...

So, 3000ms timeout is never fired. There is a way to make that example to working a little different:

setTimeout(() => {
  console.log('firing', 11000)
}, 11000)

setTimeout(() => {
  console.log('firing', 90000)
}, 90000)

setInterval(() => {
  console.log('firing', 1000)
}, 1000)

const timer4000 = setTimeout(() => {
  console.log('firing', 4000)
}, 4000)

setTimeout(() => {
  console.log('firing', 60000)
}, 60000)

setTimeout(async () => {
  console.log('firing', 100)

  const timer1500 = setTimeout(() => {
    console.log('firing', 1500)
  }, 1500)
  await Promise.resolve()
  clearTimeout(timer1500)

}, 100)

setTimeout(() => {
  console.log('firing', 3000)
}, 3000)

clearTimeout(timer4000)

setTimeout(() => {
  console.log('firing', 16000)
}, 16000)

Then, output is:

firing 100
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 11000
firing 1000
firing 1000
firing 1000
firing 1000
firing 1000
firing 16000
firing 3000
firing 1000

So, 3000ms timer is unlocked, but only after 16000ms timer is fired. O_O

I suppose, it is related to that one, but works a little different, so i am making another issue. I am a bit angry, because i spend a few days to extract specific issue form whole, async app. :/

Metadata

Metadata

Assignees

No one assigned

    Labels

    confirmed-bugIssues with confirmed bugs.timersIssues and PRs related to the timers subsystem / setImmediate, setInterval, setTimeout.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions