【问题标题】:setTimeout - callback argument must be a functionsetTimeout - 回调参数必须是一个函数
【发布时间】:2018-08-04 12:03:41
【问题描述】:

在我将 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);
     }
  })

}

【问题讨论】:

标签: javascript node.js callback settimeout


【解决方案1】:

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>) 是一种故意从 Node 实现中删除的 eval 形式。
  • @estus 不要这样。撤销该行。
【解决方案2】:

@keyur 是正确的。根据node.js timers documentation,setTimeout 函数将要执行的函数的名称作为第一个参数,以毫秒为单位的延迟作为第二个参数,然后是传递给函数的任何参数。

例如:

setTimeout(testFunction, 100, itemid, price);

【讨论】:

    【解决方案3】:

    是的,setTimeout() 需要第一个参数作为回调函数。 我们可以在这里使用 es6 胖箭头函数 你可以试试这个!

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

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      问:我在尝试使用 setTimeout 调用函数时收到错误消息“回调参数必须是函数”。为什么?

      答: setTimeout(testFunction(itemid, price), 100); 你不小心将testFunction 的输出推送为setTimeout 的第一个参数,它应该是function,因此出现错误。

      你可以做的是,传入一个函数并从那里递归调用testFunction。

      示例:

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

      【讨论】:

        猜你喜欢
        • 2020-03-08
        • 2017-05-08
        • 2021-05-02
        • 2018-08-11
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        相关资源
        最近更新 更多