我正在尝试解决此异步问题。我遇到了问题。
但是,在调用“完成”回调后,它会引发错误。我不知道为什么。
问题:
我想在调用“完成”后打印任务号。 但是它抛出了 错误,提示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上它可以正常运行,但是当我在本地运行相同的代码时,它将失败。
请帮助。
答案 0 :(得分:3)
您正在传递setTimeout
函数的结果:
setTimeout(done(num), 2000);
这将立即调用done(num)
,setTimeout
将尝试调用通过函数返回的任何done()
。
您应该向它传递一个可以调用的函数:
setTimeout(() => done(num), 2000);
或[如@JaromandaX在评论中指出],您可以利用setTimeOut
的选项第三个参数,该参数将传递给回调函数:
setTimeout(done, 2000, num);
这将调用函数done
并传入num