setInterval сохраняя старый интервал после сброса - PullRequest
0 голосов
/ 24 марта 2020

Мое приложение опрашивает о спортивных событиях каждые 5 часов. Если спортивных событий не обнаружено, этот интервал уменьшается до 1 часа. Я опустил части файла, которые не были релевантными, так как это большой файл и не имеет никакого отношения к этому интервалу. Вы можете видеть, что первоначально, если NODE_ENV является производственным, интервал для вызова pollEvents составляет 5 часов. Если нет действительных событий, setNoEventsInterval называется (вы можете видеть, когда в журналах ниже) , это должно сбросить интервал (eventPollInterval) до 1 часа. , Если после этого интервала обнаруживаются события, интервал сбрасывается до 5 часов.

index. js

const intervalPolls = {}
let eventPollInterval

function setNoEventsInterval() {
    logger.info('----- setNoEventsInterval -----')
    logger.info(`EVENT_POLL_RESET: ${process.EVENT_POLL_RESET}`)
    if (!process.EVENT_POLL_RESET) {
        clearInterval(eventPollInterval)
        eventPollInterval = null

        eventPollInterval = setInterval(() => {
            logger.info('----- NEW POLL (1 HOUR) -----')
            pollForEvents(_redis)
        }, 3600000)
        intervalPolls.timeSet = dayjs().add(3600000, 'millisecond')
        intervalPolls.check = setInterval(() => {
            const difference = dayjs().diff(intervalPolls.timeSet, 'minute')

            logger.info(`Time remaining: ${-difference} mins`)
        }, 300000) // 5 min
        logger.info(`eventPollInterval: ${eventPollInterval}`)
    }
    process.EVENT_POLL_RESET = true
}

async function pollForEvents(redis) {
    try {
        logger.info('----- pollForEvents -----')

        if (process.EVENT_POLL_RESET) {
            logger.info(`Re-polling after no events...`)
        }
        await redis.setConfig(config)

        const _config = await redis.getConfig()
        const bettableCompanies = _config.companies.filter(comp => {
            return comp.bettable && comp.active
        })
        if (process.EVENT_POLL_RESET) {
            logger.info(`Getting exchange events after reset...`)
            logger.info(`Bettable Companies: ${JSON.stringify(bettableCompanies.join(), null, 4)}`)
        }
        const exchangeEvents = await getExchangeEvents(bettableCompanies, redis)
        const exchangesWithEvents = exchangeEvents.filter(exchange => {
            return exchange.events.length
        })

        if (exchangeEvents.length === bettableCompanies.length && exchangesWithEvents.length > 1) {
            const sameEvents = utils.findSameEvents(exchangesWithEvents)

            if (sameEvents && sameEvents.length) {
                logger.info(`Same Events #: ${sameEvents.length}`)

                // If the interval was changed due to having no mathing events
                // Reset back to 5 hrs when does
                if (process.EVENT_POLL_RESET) {
                    clearInterval(eventPollInterval)

                    eventPollInterval = setInterval(pollForEvents, 18000000, redis)
                    process.EVENT_POLL_RESET = false
                }
                await writeMatchedEvents(sameEvents)
                await writeUnmatchedEvents(exchangesWithEvents)

                await dbApi.postMatchedEvents(sameEvents)

                process.MATCHED_EVENTS = await dbApi.getMatchedEvents()

                const nextEventStartTime = process.MATCHED_EVENTS[0].startTime
                const parsedStartTime = new Date(nextEventStartTime).toString()

                logger.info(`The next event is @ ${parsedStartTime}`)

                if (process.env.NODE_ENV === 'production') {
                    handleProduction()
                }
            } else {
                // Was originally exiting here but the docker container will just restart immediately
                // So a bit pointless. 1 hour
                logger.info('[NO MATCHED EVENTS]')

                setNoEventsInterval()
            }
        } else {
            logger.info('[NO EVENTS FROM ALL EXCHANGES/NOT ALL HAVE EVENTS]')

            setNoEventsInterval()
        }
    } catch(err) {
        throw err
    }
}

module.exports = async function(redis) {
    try {
        _redis = redis

        await pollForEvents(redis)

        if (process.env.NODE_ENV === 'production') {
            // Poll for new events every 5 hours
            clearInterval(eventPollInterval)

            eventPollInterval = setInterval(pollForEvents, 18000000, redis)
        }
    } catch (err) {
        process.exit(1)
    }
}

Это были журналы:

$ node --max-old-space-size=8192 src/app.js
[2020-03-24 02:00:42] ~ INFO: ----- pollForEvents -----
[2020-03-24 02:00:44] ~ INFO: [NO EVENTS FROM ALL EXCHANGES/NOT ALL HAVE EVENTS]
[2020-03-24 02:00:44] ~ INFO: ----- setNoEventsInterval -----
[2020-03-24 02:00:44] ~ INFO: EVENT_POLL_RESET: undefined
[2020-03-24 02:00:44] ~ INFO: intervalPolls.event: [object Object]
[2020-03-24 02:05:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 02:10:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 02:15:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 02:20:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 02:25:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 02:30:44] ~ INFO: Time remaining: 29 mins
[2020-03-24 02:35:44] ~ INFO: Time remaining: 24 mins
[2020-03-24 02:40:44] ~ INFO: Time remaining: 19 mins
[2020-03-24 02:45:44] ~ INFO: Time remaining: 14 mins
[2020-03-24 02:50:44] ~ INFO: Time remaining: 9 mins
[2020-03-24 02:55:44] ~ INFO: Time remaining: 4 mins
[2020-03-24 03:00:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 03:05:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 03:10:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 03:15:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 03:20:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 03:25:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 03:30:44] ~ INFO: Time remaining: 29 mins
[2020-03-24 03:35:44] ~ INFO: Time remaining: 24 mins
[2020-03-24 03:40:44] ~ INFO: Time remaining: 19 mins
[2020-03-24 03:45:44] ~ INFO: Time remaining: 14 mins
[2020-03-24 03:50:44] ~ INFO: Time remaining: 9 mins
[2020-03-24 03:55:44] ~ INFO: Time remaining: 4 mins
[2020-03-24 04:00:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 04:05:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 04:10:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 04:15:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 04:20:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 04:25:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 04:30:44] ~ INFO: Time remaining: 29 mins
[2020-03-24 04:35:44] ~ INFO: Time remaining: 24 mins
[2020-03-24 04:40:44] ~ INFO: Time remaining: 19 mins
[2020-03-24 04:45:44] ~ INFO: Time remaining: 14 mins
[2020-03-24 04:50:44] ~ INFO: Time remaining: 9 mins
[2020-03-24 04:55:44] ~ INFO: Time remaining: 4 mins
[2020-03-24 05:00:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 05:05:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 05:10:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 05:15:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 05:20:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 05:25:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 05:30:44] ~ INFO: Time remaining: 29 mins
[2020-03-24 05:35:44] ~ INFO: Time remaining: 24 mins
[2020-03-24 05:40:44] ~ INFO: Time remaining: 19 mins
[2020-03-24 05:45:44] ~ INFO: Time remaining: 14 mins
[2020-03-24 05:50:44] ~ INFO: Time remaining: 9 mins
[2020-03-24 05:55:44] ~ INFO: Time remaining: 4 mins
[2020-03-24 06:00:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 06:05:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 06:10:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 06:15:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 06:20:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 06:25:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 06:30:44] ~ INFO: Time remaining: 29 mins
[2020-03-24 06:35:44] ~ INFO: Time remaining: 24 mins
[2020-03-24 06:40:44] ~ INFO: Time remaining: 19 mins
[2020-03-24 06:45:44] ~ INFO: Time remaining: 14 mins
[2020-03-24 06:50:44] ~ INFO: Time remaining: 9 mins
[2020-03-24 06:55:44] ~ INFO: Time remaining: 4 mins 
[2020-03-24 07:00:44] ~ INFO: ----- pollForEvents -----
[2020-03-24 07:00:44] ~ INFO: Re-polling after no events...
[2020-03-24 07:00:44] ~ INFO: Getting exchange events after reset...
[2020-03-24 07:00:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 07:00:45] ~ INFO: Same Events #: 2
[2020-03-24 07:00:45] ~ INFO: The next event is @ Tue Mar 24 2020 09:30:00 GMT+0000 (Coordinated Universal Time)
[2020-03-24 07:05:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 07:10:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 07:15:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 07:20:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 07:25:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 07:30:44] ~ INFO: Time remaining: 29 mins
[2020-03-24 07:35:44] ~ INFO: Time remaining: 24 mins
[2020-03-24 07:40:44] ~ INFO: Time remaining: 19 mins
[2020-03-24 07:45:44] ~ INFO: Time remaining: 14 mins
[2020-03-24 07:50:44] ~ INFO: Time remaining: 9 mins
[2020-03-24 07:55:44] ~ INFO: Time remaining: 4 mins
[2020-03-24 08:00:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 08:05:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 08:10:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 08:15:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 08:20:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 08:25:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 08:30:44] ~ INFO: Time remaining: 29 mins
[2020-03-24 08:35:44] ~ INFO: Time remaining: 24 mins
[2020-03-24 08:40:44] ~ INFO: Time remaining: 19 mins
[2020-03-24 08:45:44] ~ INFO: Time remaining: 14 mins
[2020-03-24 08:50:44] ~ INFO: Time remaining: 9 mins
[2020-03-24 08:55:44] ~ INFO: Time remaining: 4 mins
[2020-03-24 09:00:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 09:05:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 09:10:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 09:15:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 09:20:00] ~ INFO: New worker being forked: 5e79b01d808b70001ddd2986
[2020-03-24 09:20:00] ~ INFO: Worker 5e79b01d808b70001ddd2986 is now online [PROCESS #: 1]
[2020-03-24 09:20:01] ~ INFO: New worker being forked: 5e79b01d808b70001ddd2987
[2020-03-24 09:20:01] ~ INFO: Worker 5e79b01d808b70001ddd2987 is now online [PROCESS #: 2]
[2020-03-24 09:20:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 09:25:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 09:30:08] ~ WARN: [NO VALID MARKETS]
[2020-03-24 09:30:08] ~ INFO: Worker 5e79b01d808b70001ddd2986 died 0 [PROCESS #: 1]
[2020-03-24 09:30:09] ~ WARN: [NO VALID MARKETS]
[2020-03-24 09:30:09] ~ INFO: Worker 5e79b01d808b70001ddd2987 died 0 [PROCESS #: 0]
[2020-03-24 09:30:09] ~ INFO: No more matched events. Setting the poll to 1 hour
[2020-03-24 09:30:09] ~ INFO: ----- setNoEventsInterval -----
[2020-03-24 09:30:09] ~ INFO: EVENT_POLL_RESET: false
[2020-03-24 09:30:09] ~ INFO: intervalPolls.event: [object Object]
[2020-03-24 09:30:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 09:35:09] ~ INFO: Time remaining: 54 mins
[2020-03-24 09:35:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 09:40:09] ~ INFO: Time remaining: 49 mins
[2020-03-24 09:40:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 09:45:09] ~ INFO: Time remaining: 44 mins
[2020-03-24 09:45:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 09:50:09] ~ INFO: Time remaining: 39 mins
[2020-03-24 09:50:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 09:55:09] ~ INFO: Time remaining: 34 mins
[2020-03-24 09:55:44] ~ INFO: Time remaining: 34 mins
[2020-03-24 10:00:09] ~ INFO: Time remaining: 29 mins
[2020-03-24 10:00:44] ~ INFO: Time remaining: 29 mins
[2020-03-24 10:05:09] ~ INFO: Time remaining: 24 mins
[2020-03-24 10:05:44] ~ INFO: Time remaining: 24 mins
[2020-03-24 10:10:09] ~ INFO: Time remaining: 19 mins
[2020-03-24 10:10:44] ~ INFO: Time remaining: 19 mins
[2020-03-24 10:15:09] ~ INFO: Time remaining: 14 mins
[2020-03-24 10:15:44] ~ INFO: Time remaining: 14 mins
[2020-03-24 10:20:09] ~ INFO: Time remaining: 9 mins
[2020-03-24 10:20:44] ~ INFO: Time remaining: 9 mins
[2020-03-24 10:25:09] ~ INFO: Time remaining: 4 mins
[2020-03-24 10:25:44] ~ INFO: Time remaining: 4 mins
[2020-03-24 10:30:09] ~ INFO: ----- pollForEvents -----
[2020-03-24 10:30:09] ~ INFO: Re-polling after no events...
[2020-03-24 10:30:09] ~ INFO: Getting exchange events after reset...
[2020-03-24 10:30:09] ~ INFO: Time remaining: 59 mins
[2020-03-24 10:30:11] ~ INFO: [NO MATCHED EVENTS]
[2020-03-24 10:30:11] ~ INFO: ----- setNoEventsInterval -----
[2020-03-24 10:30:11] ~ INFO: EVENT_POLL_RESET: true
[2020-03-24 10:30:44] ~ INFO: Time remaining: 59 mins
[2020-03-24 10:35:09] ~ INFO: Time remaining: 54 mins
[2020-03-24 10:35:44] ~ INFO: Time remaining: 54 mins
[2020-03-24 10:40:09] ~ INFO: Time remaining: 49 mins
[2020-03-24 10:40:44] ~ INFO: Time remaining: 49 mins
[2020-03-24 10:45:09] ~ INFO: Time remaining: 44 mins
[2020-03-24 10:45:44] ~ INFO: Time remaining: 44 mins
[2020-03-24 10:50:09] ~ INFO: Time remaining: 39 mins
[2020-03-24 10:50:44] ~ INFO: Time remaining: 39 mins
[2020-03-24 10:55:09] ~ INFO: Time remaining: 34 mins
[2020-03-24 10:55:44] ~ INFO: Time remaining: 34 mins

Из журналов видно, что при первоначальном вызове setNoEventsInterval @ [2020-03-24 02:00:44] этот интервал будет сброшен как EVENT_POLL_RESET был ложным. Однако pollEvents тогда не вызывали до [2020-03-24 07:00:44] , то есть через 5 часов после первоначального вызова этой функции, каковым был первоначальный интервал.

Когда больше нет действительных событий, тогда снова вызывается setNoEventsInterval @ [2020-03-24 09:30:09] , где он снова сбрасывает интервал, но на этот раз он работал как Вы можете видеть, что pollEvents тогда назывался @ [2020-03-24 10:30:09] .

Почему, в первый раз, интервал, кажется, не очищается должным образом но все же это происходит на 2 go вокруг? Меня также смущает, почему переменная remainingMinutes сбрасывает время, поскольку я не сбрасываю его интервал. Между [2020-03-24 07:55:44] & [2020-03-24 08:00:44] , оставшееся время увеличивается с 4 минут до 59 минут , но насколько я вижу, я вообще не сбрасываю переменную timeSet

РЕДАКТИРОВАТЬ

Неважно, что осталось до минуты, понял что это просто катится по часам и я получаю минуты с того часа. Тем не менее, я все еще не понимаю, почему интервал не изменяется.

РЕДАКТИРОВАТЬ 2

Я добавляю больше журналов, когда интервал первоначально разрешается через 1 час, поэтому я ожидаю ----- NEW POLL (1 HOUR) ----- быть зарегистрированным, но это никогда не будет

1 Ответ

0 голосов
/ 27 марта 2020

Я понял это в конце, когда отлаживал. Проблема была в непосредственном вызове функции, я жду вызова к pollForEvents. Если это возвращает отсутствие событий или, по какой-либо другой причине, вызывается setNoEventsInterval, интервал устанавливается равным часу. Однако, когда pollForEvents в конечном итоге разрешается, условие, если NODE_ENV - «производство», снова устанавливает его на 5 часов. Вот почему я видел это только на первом опросе, а не на последующих. Я только что добавил условие, что если eventPollInterval существует, не сбрасывайте его.

...