Мой код работал, пока я не обновил 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);
}
})
}
Согласен, @MHH, вы, вероятно, просто не заметили, что testFunction был вызван не через 100 мс, а сразу - вы не передавали функцию testFunction в качестве аргумента setTimeout, а скорее результат ее вызова. Обновление до Node 8.11.3 выявило вашу ошибку, потому что оно больше не позволяет передавать ничего, кроме функции.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Аргумент обратного вызова для 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 Не об этом. Отзыв этой строки.
Вопрос: Я получаю сообщение об ошибке «аргумент обратного вызова должен быть функцией» при попытке вызвать функцию с помощью 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);
Код никогда не работал так, как задумано, к вашему сведению.