2016-04-25 10 views
0

私は定数PATHオブジェクトを持つgulpfileを持っています。そのフィールドの1つが配列です。私はそれを繰り返し、異なるタスクに反応するために異なる時計を割り当てたい。しかし、私はそれをループで試してみると、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の値が各コールバックで意図されたとおりになるようにするには、async関数呼び出しを新しい関数の中にラップする必要があります。このパターンを試してみてください:

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); 
}