2016-04-25 82 views
0

我有一个常量PATH对象的gulpfile。其中一个领域是数组。我想遍历它,并分配不同的手表来应对不同的任务。但是当我尝试在循环中分配任务时:gulp中的命名空间

for(var i = 0; i < PATH.PHP[i].MODULE.length; i++){ 
    gulp.task('sync-'+PATH.PHP[i].MODULE, function(){ 
    return gulp.src(PATH.PHP[i].IN) 
     .pipe(newer(PATH.PHP[i].OUT)) 
     .pipe(gulp.dest(PATH.PHP[i].OUT)); 
    }); 
} 

PATH.PHP [i]没有在匿名函数中定义。我需要它的原因是因为如果我观察整个文件夹,如果通过诸如“gulp-newer”和“gulp-changed”等插件预处理,则需要太多时间与远程同步。

+0

嗯,这显然是一个错误,但它不会改变的事实,PATH常数不匿名函数:( – 0xCAFEBABE

+0

内可见如果我通过简单的字符串,而不是它的工作原理变量字段,所以我敢肯定它是命名空间问题。 – 0xCAFEBABE

+0

[在javascript for循环中使用匿名函数]的可能重复(http://stackoverflow.com/questions/13977046/using-anonymous-function-in-javascript-for-loops ) –

回答

0

问题是for循环内的异步函数调用。当回调触发时,它最有可能已经达到了最终值,因此每个回调都被调用相同的值i

您需要在新函数中包装异步函数调用,以确保i的值在每个回调中都符合预期。试试这个模式:

for(var i = 0; i < PATH.PHP[i].MODULE.length; i++){ 
    (function(i){ 
    gulp.task('sync-'+PATH.PHP[i].MODULE, function(){ 
     return gulp.src(PATH.PHP[i].IN) 
     .pipe(newer(PATH.PHP[i].OUT)) 
     .pipe(gulp.dest(PATH.PHP[i].OUT)); 
    }); 
    })(i); 
}