为什么我可能会在 gulp 中得到 "task completion callback called too many times"?
Why might I be getting "task completion callback called too many times" in gulp?
给定以下 gulp 任务,为什么我会收到以下错误?
Error: task completion callback called too many times
function myTask(options, cb) { // cb is the gulp cb
var serverInstance = http.createServer(dispatch({ /*routes*/ }));
serverInstance.listen(options.port, function() {
cb(); // Stack trace identifies this line as throwing the error
});
}
function partial(fn) {
var args = Array.prototype.slice.call(arguments, 1);
return function() {
return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));
};
}
gulp.task('task-name', ['task-dependency'], partial(myTask, { port: 8080 }));
编辑:
以下修改使其有效(但我的问题仍然存在):
gulp.task('task-name', ['task-dependency'], function(cb) {
partial(myTask, { port: 8080 })(cb);
});
这是因为 gulp 使用启发式方法(包括回调的 return 值以及它是否接受回调参数)来检测异步任务与同步任务,并相应地区别对待它们。我的部分函数 return 是一个没有声明参数的函数,它在异步时欺骗 gulp 认为它是同步的。
将 partial
修改为 return 具有单个命名参数的函数解决了该问题。
//...
return function(cb) {
return fn.apply(this, args.concat(slice.call(arguments)));
};
//...
给定以下 gulp 任务,为什么我会收到以下错误?
Error: task completion callback called too many times
function myTask(options, cb) { // cb is the gulp cb
var serverInstance = http.createServer(dispatch({ /*routes*/ }));
serverInstance.listen(options.port, function() {
cb(); // Stack trace identifies this line as throwing the error
});
}
function partial(fn) {
var args = Array.prototype.slice.call(arguments, 1);
return function() {
return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));
};
}
gulp.task('task-name', ['task-dependency'], partial(myTask, { port: 8080 }));
编辑:
以下修改使其有效(但我的问题仍然存在):
gulp.task('task-name', ['task-dependency'], function(cb) {
partial(myTask, { port: 8080 })(cb);
});
这是因为 gulp 使用启发式方法(包括回调的 return 值以及它是否接受回调参数)来检测异步任务与同步任务,并相应地区别对待它们。我的部分函数 return 是一个没有声明参数的函数,它在异步时欺骗 gulp 认为它是同步的。
将 partial
修改为 return 具有单个命名参数的函数解决了该问题。
//...
return function(cb) {
return fn.apply(this, args.concat(slice.call(arguments)));
};
//...