Javascript 为什么我会得到;任务完成回调调用次数过多”;狼吞虎咽?

Javascript 为什么我会得到;任务完成回调调用次数过多”;狼吞虎咽?,javascript,gulp,Javascript,Gulp,考虑到下面的吞咽任务,为什么会出现以下错误 错误:调用任务完成回调的次数太多 编辑: 以下修改使其工作(但我的问题仍然存在): 这是因为gulp使用试探法(包括回调的返回值以及它是否接受回调参数)来检测异步与同步任务,并相应地对它们进行不同的处理。我的分部函数返回一个未声明参数的函数,该函数诱使gulp在异步时认为它是同步的 修改partial以返回带有单个命名参数的函数解决了该问题 //... return function(cb) { return fn.apply(this, args

考虑到下面的吞咽任务,为什么会出现以下错误

错误:调用任务完成回调的次数太多

编辑:

以下修改使其工作(但我的问题仍然存在):


这是因为gulp使用试探法(包括回调的返回值以及它是否接受回调参数)来检测异步与同步任务,并相应地对它们进行不同的处理。我的分部函数返回一个未声明参数的函数,该函数诱使gulp在异步时认为它是同步的

修改
partial
以返回带有单个命名参数的函数解决了该问题

//...
return function(cb) {
  return fn.apply(this, args.concat(slice.call(arguments)));
};
//...

我不太熟悉gulp,但它不是用于执行构建吗?您似乎正在使用它来启动服务器。如果您多次访问该服务器,
cb()
回调将被多次调用。是的,在构建任务结束时,已启动一台服务器,该服务器将在开发人员的计算机上交付应用程序以进行测试。@JLRishe当服务器引发侦听事件(IIUC)时,仅调用一次提供的回调这个问题是否与需要向gulp提供关于任务终止方式的提示有关?@JLRishe不符合http服务器文档的要求。当服务器开始侦听时,应该只调用该回调一次。如果您对部分函数应用程序使用
.bind()
,它将创建一个具有正确arity的函数:
(函数myTask(options,cb){})。bind(null,{port:8080})。length==1
很好。我最初避免绑定是因为我不想影响函数的接收者。另外,是否有一种机制可以在不使用bind(或eval)的情况下在运行时更改函数的arity?例如,
length
是可写的吗?编辑:no
length
是不可写的afaik,唯一的其他选项是使用函数构造函数,但这很有技巧。该语法实际上没有提供任何clean选项来动态指示所创建函数的参数数量。lodash的
.bind
.curry
.partial
所有返回函数的算术数均为0。
gulp.task('task-name', ['task-dependency'], function(cb) {
  partial(myTask, { port: 8080 })(cb);
});
//...
return function(cb) {
  return fn.apply(this, args.concat(slice.call(arguments)));
};
//...