Ошибка TypeError, вызванная setInterval с использованием node.js

Я новичок в NodeJS, у меня работает микросервис, и я хочу открыть веб-страницу без браузера, чтобы делать запросы api на стороне клиента каждые 20 секунд. Я пытаюсь использовать пакет openurl

const openPage = require("openurl");

function openUpPage(url){
  openPage.open(url);
}

setInterval(openUpPage("myURl"), 20000);

Однако мне возвращается «TypeError: аргумент обратного вызова должен быть функцией» при вызове setInterval(...).

Есть идеи, как это сделать с помощью setInterval?

Где у вас ошибка? Я предполагаю, что внутри функции openUpPage?

Luca Kiebel 27.06.2018 18:15

Вы запускаете openUpPage("myURl") и устанавливаете то, что он возвращает, в setInterval. Поскольку он ничего не возвращает, ваш вызов в основном. setInterval(undefined, 20000); Не имеет отношения к проблеме, но ваш код не будет выполняться с интервалом.

epascarello 27.06.2018 18:25

@Luca В реализации open в пакете openurl указано, что обратный вызов является необязательным. Итак, я предположил, что ошибка возникает на setInverval.

Bee 27.06.2018 18:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
1 208
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно передать обратный вызов setInterval вместо того, чтобы сразу вызывать вашу функцию, используя в качестве примера анонимную стрелочную функцию.

setInterval(() => openUpPage("myURl"), 20000);

Однако стрелочная функция не обязательна.

setInterval(function() { openUpPage("myURl") }, 20000);

При тестировании я выяснил, что ошибка "TypeError: "callback" argument must be a function", выдаваемая setInverval, связана с node.js. Фрагмент кода из вопроса запускается без ошибок в коде (с использованием Chrome).

Это вызвано тем, что чистый javascript не может реализовать такие функции, связанные с таймером, из-за отсутствия поддержки низкого уровня. Поэтому браузеры и node.js не обязательно используют одну и ту же реализацию, как показано в документации.

Несмотря на то, что сразу вызывать функцию, как видно из фрагмента вопросов, бессмысленно в сочетании с setInterval, независимо от реализации.

@epascarello На основании опубликованного фрагмента setInterval - единственный вызов, который может вызвать эту ошибку, не так ли? Реализация open в пакете openurl заявляет, что обратный вызов является необязательным. Обновлено: первоначальный комментарий удален!

Bee 27.06.2018 18:29

Привет, Дэвид! Спасибо за ответ. Я попробовал ваш код, но все еще получаю сообщение об ошибке events.js: 183 throw er; // Необработанное событие 'error' Ошибка: порождение xdg-open ENOENT в _errnoException (util.js: 1022: 11) в Process.ChildProcess._handle.onexit (internal / child_process.js: 190: 19) в onErrorNT (internal / child_process .js: 372: 16) в _combinedTickCallback (internal / process / next_tick.js: 138: 11) в process._tickCallback (internal / process / next_tick.js: 180: 9)

Daniel 02.07.2018 13:21

@Daniel Похоже, что-то вызвано пакетом child_process node.js. Без кода трудно сказать, в чем причина. Но не похоже, что проблема в setInterval. Итак, я думаю, что первоначальный вопрос был решен, поэтому вам следует создать еще один вопрос.

Bee 02.07.2018 14:46

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