2015-09-24 16 views
19

私はgulpでpluralsightコースを使っています。 John Papaは、既存のcssファイルを削除する関数を、新しいものをコンパイルするルーチンに挿入する方法をデモンストレーションしています。ノードのdelコマンド - コールバックが発砲しない

del関数のコールバックが発生していません。 del関数が実行され、ファイルが削除され、エラーメッセージは表示されません。私がコールバックを手動で呼び出すと実行されるので、その関数が手元にあるように見えます。だから私はデルがコールバックを実行しないようにする原因になるのだろうかと思っています。

ルーチンの削除:

function clean(path, done) { 
    log('cleaning ' + path); 
    del(path, done); // problem call 
} 

「行って」関数が発射されていませんが、私はこれにコードを変更した場合それがない:

function clean(path, done) { 
    log('cleaning ' + path); 
    del(path); 
    done(); 
} 
もちろん、所期の目的に反し、

delが完了するまで待ってから続けてください。

何が起こっているかについてのアイディアは高く評価されます。誰がに実行された場合

gulp.task('clean-styles', function(done){ 
    var files = config.temp + '/**/*.css'; 
    clean(files, done); 
}); 

UPDATE

gulp.task('styles', ['clean-styles'], function(){ 
    log('compiling less'); 
    return gulp 
     .src(config.less) 
     .pipe($.less()) 
     .pipe($.autoprefixer({browsers:['last 2 versions', '> 5%']})) 
     .pipe(gulp.dest(config.temp)); 
}); 

はクリーン機能を注射さ:

コンパイルCSS機能:(該当する場合)の参考のため

これは、trainiを見直したそれはv1.1のdelを使っていました。私はチェックし、私は2.xを使用していました。 v 1.1をインストールした後、すべての作業。

+0

[Gulp clean/del behaviorの複製が変更されました](http://stackoverflow.com/questions/32605090/gulp-clean-del-behaviour-has-changed) – Louis

答えて

22

delはノードのコマンドではありません。おそらくthis npmパッケージです。その場合、2番目のパラメータとしてコールバックを受け取らず、代わりに約束を返し、delが終了した後に呼び出すには、.then(done)を呼び出す必要があります。

がにあなたのclean機能を変更します:

function clean(path) { 
    return del(path); // returns a promise 
} 

そして、あなたのclean-stylesタスクに:

gulp.task('clean-styles', function(){ 
    var files = config.temp + '/**/*.css'; 
    return clean(files); 
}); 

更新

より良い解決策を包含するガルプの約束の性質であります

+0

ありがとうございました。面白い私はそれを試みたが、それはエラーを投げた。 .then(done())何らかの理由で動作します。私を投げていたのは、del(path、done)でビデオを見ていて、うまくいきました。 – Steve

+0

'.then(done())'を呼び出すのは本当ですか?私にとっては、done関数を(途中で)呼び出すだけで、それを 'del'約束のコールバックとして返すように思えます。あなたは '.then(done)'を試してみたときにエラーを貼り付けますか? – gfpacheco

+0

良い点はもちろん、そこでの発射です。ここではエラーが発生しました:http://prntscr.com/8k3z3g – Steve

4

ドキュメントを確認するfor the del packageノードの標準的なコールバックメカニズムと約束を使っているdelの間で混乱しているようです。

コールバックパラメータを実行するには、promises APIと.then(done)を使用します。

一般的に、ノードとJavaScriptは、非同期コードを扱うデザインパターンのために、現在のところビットマップになっています。ノードコミュニティはコールバックスタイルの傾向がありますが、 asyncなどのライブラリ。

ES6の標準化が約束されていることから、私は、このAPIに熱心な人々がノードコードにますます組み込まれるようになるにつれて、これらの種類の非互換性がノードで増えていくだろうと考えています。

12

version 2.0の時点で、delのAPIが約束を使用するように変更されました。あなたは.then使うべきコールバックを指定するには、このように

():

del('unicorn.png').then(callback); 

あなたは一口タスクからそれを呼び出す必要がある場合は - ちょうどタスクからの約束を返す:

可能
gulp.task('clean', function() { 
    return del('unicorn.png'); 
}); 
関連する問題