回调函数抛出错误

时间:2018-08-18 00:50:34

标签: javascript asynchronous

我正在尝试解决此异步问题。我遇到了问题。

但是,在调用“完成”回调后,它会引发错误。我不知道为什么。

问题

  

我想在调用“完成”后打印任务号。   但是它抛出了   错误,提示TypeError:“回调”参数必须是函数

问题:

  

“ TaskRunner”构造函数采用一个参数“ concurrency”,并且   在其原型上公开一种方法“推”。 “推”方法需要   一个参数“任务”是一个“功能”

     

将任务传递给TaskRunner实例的push方法   立即执行(调用/运行/调用)任务,除非该号码   当前正在运行的任务数超过了并发限制。

function TaskRunner(concurrency) {
    this.count = concurrency;
    this.queue = [];
  }
  
  TaskRunner.prototype.push = function(task) {
    if (this.count === 0) {
      this.queue.push(task);
    } else {
      this.invoke(task);
    }
  }
  
  TaskRunner.prototype.invoke = function(task) {
    task.call(null, this.done.bind(this));
    this.count--;
  }
  
  TaskRunner.prototype.done = function(num) {
    console.log(`After Executing done: ${num}`)
    this.count++;
    this.execute();
  }
  
  TaskRunner.prototype.execute = function() {
    if (this.queue.length > 0) {
      var task = this.queue.shift();
      this.invoke(task);
    }
  }

  function factory(num) {
    return function exampleSimpleTask(done) {
      this.num = num;
      console.log("task", "Before " + new Date().getTime());
      setTimeout(done(num), 2000);
    }
  }


  var r = new TaskRunner(2);

r.push(factory(1));
r.push(factory(2));
r.push(factory(3));

编辑:由于某种原因,在jsfiddle上它可以正常运行,但是当我在本地运行相同的代码时,它将失败。

请帮助。

1 个答案:

答案 0 :(得分:3)

您正在传递setTimeout函数的结果

setTimeout(done(num), 2000);

这将立即调用done(num)setTimeout将尝试调用通过函数返回的任何done()

您应该向它传递一个可以调用的函数:

setTimeout(() => done(num), 2000);

或[如@JaromandaX在评论中指出],您可以利用setTimeOut的选项第三个参数,该参数将传递给回调函数:

setTimeout(done, 2000, num);

这将调用函数done并传入num