SetTimeout - аргумент обратного вызова должен быть функцией

Мой код работал, пока я не обновил node.js до версии 8.11.3.

Теперь я всегда получаю ошибку «аргумент обратного вызова должен быть функцией» при попытке вызвать функцию с помощью setTimeout.

function testFunction(itemid, price) {

  var url = 'https://example.com';
  var options = {
  method: 'get',
  url: url
  }

  request(options, function (err, res, body) {
    var response = JSON.parse(body);

     if (response.status == 'fail'){
        setTimeout(testFunction(itemid, price), 100);
     }
  })

}

Код никогда не работал так, как задумано, к вашему сведению.

Estus Flask 04.08.2018 14:10

Согласен, @MHH, вы, вероятно, просто не заметили, что testFunction был вызван не через 100 мс, а сразу - вы не передавали функцию testFunction в качестве аргумента setTimeout, а скорее результат ее вызова. Обновление до Node 8.11.3 выявило вашу ошибку, потому что оно больше не позволяет передавать ничего, кроме функции.

Patrick Hund 04.08.2018 14:19
Поведение ключевого слова "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
2
15 312
4

Ответы 4

Аргумент обратного вызова для setTimeout должен быть функцией. Напишите это так. Не проверял, но должен работать.

function testFunction(itemid, price) {

    var url = 'https://example.com';
    var options = {
        method: 'get',
        url: url
    }

    request(options, function (err, res, body) {
        var response = JSON.parse(body);
        if (response.status == 'fail'){
            setTimeout(function () {
                testFunction(itemid, price);
            }, 100);
        }
    })
}
всегда требуется функция в качестве аргумента обратного вызова - нет. setTimeout(<string>) - это форма eval, которая была намеренно удалена из реализации Node.
Estus Flask 04.08.2018 14:13

@estus Не об этом. Отзыв этой строки.

Keyur Ramoliya 04.08.2018 14:27

Вопрос: Я получаю сообщение об ошибке «аргумент обратного вызова должен быть функцией» при попытке вызвать функцию с помощью setTimeout. Почему?

А:setTimeout(testFunction(itemid, price), 100); Вы случайно включили вывод testFunction в качестве первого аргумента setTimeout, который, как предполагается, является function и, следовательно, ошибкой.

Что вы можете сделать, так это передать функцию и оттуда рекурсивно вызвать testFunction.

Пример:

function test(itemid, price) {
    console.info("hello => " + itemid + ", " + price);
    if (price < 50) {
      setTimeout(() => { test(itemid, price + 10) }, 100);    
    }
}

test(100, 10)

Да, setTimeout () ожидает первый аргумент как функцию обратного вызова. мы можем использовать функцию жирной стрелки es6 здесь вы можете попробовать это!

setTimeout(() => testFunction(itemid, price), 100);

Надеюсь это поможет!

@keyur правильный. Согласно Документация по таймерам node.js функция setTimeout принимает имя функции для выполнения в качестве первого аргумента, задержку в миллисекундах в качестве второго аргумента, а затем любые аргументы, передаваемые функции.

Например:

setTimeout(testFunction, 100, itemid, price);

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