Таймеры узла не работают в соответствии с документацией

Так что я действительно потерялся в этом. Я использую ubuntu и nvm для узла. Я даже удалил версию узла, которая была установлена ​​с apt, чтобы убедиться, что

node --version
> v10.10.0

npm --version
> 6.4.1

Итак, я create-react-app и использую этот простой код

import React from 'react'
import ReactDOM from 'react-dom'

class App extends React.Component
{
    componentDidMount()
    {
        const a = setTimeout(() => {return}, 5000)
        console.log("a = ", a)
    }

    render()
    {
        return (
        <div>
            hello
        </div>)
    }
}

ReactDOM.render(<App />, document.getElementById('root'))

Потом у меня npm start. При доступе к странице консоль отображает номер (a = 4). Однако https://nodejs.org/api/timers.html утверждает, что setTimeout должен возвращать объект Timeout, а не идентификатор.

Для меня это проблема, потому что я хочу вызвать refresh для сохраненной переменной и не могу прямо сейчас (я не нашел способов получить объект тайм-аута на основе идентификатора) .
Это проблема реакции, связанная с использованием неправильной версии узла? Или это регресс? Я тоже безуспешно пробовал версию 10.2.

Заранее спасибо!

Вы визуализируете эту сторону сервера кода React и получаете журнал в консоли узла, или этот журнал отображается в консоли браузера?

caffeinated.tech 10.09.2018 11:12

Журнал находится на стороне пользователя, я использую серверную часть npm start. В любом случае a.refresh() или a.ref() вылетает с TypeError: a.ref/a.refresh is not a function, так что, насколько я понимаю, это не простая проблема с отображением.

snow_lemurian_snow 10.09.2018 11:15
0
2
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

«Объекты тайм-аута» на самом деле являются просто идентификатором тайм-аута, который является числом. Поэтому я думаю, что API ведет себя так, как указано.

Возможно, путаница в том, что в Nodejs он возвращает объект, а в браузере - идентификатор. Ваш код выполняется в браузере, а не в Nodejs. См. Обсуждение герр: Что возвращает setTimeout?

Тогда я неправильно понимаю. nodejs.org/api/timers.html#timers_class_timeout Здесь говорится, что он возвращается setTimeout, и, как я уже сказал, я хочу вызывать на нем функции, но и a.ref(), и a.refresh() сообщают мне TypeError: a.ref/a.refresh is not a function, поскольку typeof a - это число. Как я должен вызывать эти функции? Я прочитал ссылку, которую вы упомянули перед публикацией, и stackoverflow.com/a/19375604/7676564 утешил меня мыслью, что что-то не работает должным образом

snow_lemurian_snow 10.09.2018 11:05
github.com/nodejs/node-v0.x-archive/issues/… это также говорит о том, что это должно было быть таким с самого начала, хотя могло произойти критическое изменение
snow_lemurian_snow 10.09.2018 11:09

Думаю, другой вопрос лучше объяснял путаницу, которая имела место в отношении того, какая среда Javascript выполняет ваш код.

Herku 10.09.2018 21:50
Ответ принят как подходящий

Ваш код реакции выполняется в браузере, а не в NodeJS. Это означает, что документация, которую вам нужно просмотреть для setTimeout, отличается. См. Документация MDN по setTimeout, показывающий, что он должен возвращать timeoutID, который может быть передан в clearTimeout.

Насколько мне известно, в браузере нет эквивалента для timer.refresh(), но вы, вероятно, можете найти библиотеку, реализующую это поведение, или реализовать ее самостоятельно.

О, это имеет смысл, не видел, чтобы было два разных документа / объекта. Тогда я что-нибудь сделаю быстро

snow_lemurian_snow 10.09.2018 11:25

Другие вопросы по теме