setTimeout - callback argument must be a function

混江龙づ霸主 提交于 2020-01-11 11:24:09

问题


My code was working until i updated node.js to version 8.11.3

Now i always get error "callback argument must be a function" when trying to call a function with 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);
     }
  })

}

回答1:


Callback argument for setTimeout must be a function. Write it like this. Not tested but it should work.

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);
        }
    })
}



回答2:


@keyur is correct. According to the node.js timers documentation the setTimeout function takes the name of the function to execute as the first argument, the delay in milliseconds as the second argument, followed by any arguments being passed to the function.

For Example:

setTimeout(testFunction, 100, itemid, price);



回答3:


Q: I am getting the error "callback argument must be a function" when trying to call a function with setTimeout. Why?

A: setTimeout(testFunction(itemid, price), 100); You have accidentally pushed the output of testFunction as the first argument of setTimeout which it is suppose to be a function and hence the error.

What you could do is, pass in a function and call the testFunction recursively from there.

Example:

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

test(100, 10)



回答4:


Yes, setTimeout() expects first argument as callback function. we can make use of es6 fat arrow function here you can try this!

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

Hope this helps!



来源:https://stackoverflow.com/questions/51685383/settimeout-callback-argument-must-be-a-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!