2016-12-20 10 views
2

私はループ内でサブタスクを同期して実行するタスクを望みます。サブタスクがフラグの値を変更すると、そのようなループは壊れます。ここでGruntタスクを同期的に(プログラム的に)実行するにはどうすればよいですか?

は、私が何をしようとしているのサンプルです:私はこのうち取得したい何

grunt.registerTask('complexTask', 'Run sub-tasks synchronously.', function() { 
    var value; 
    do { 
     // 'changeValueTask' task sets 'importantValue' 
     grunt.task.run(['preTask', 'changeValueTask', 'postTask']); 
     value = grunt.config('importantValue'); 
    } while (!value); 
    // ... end task 
}); 

  • 確認作業(['preTask', 'changeValueTask', 'postTask']の各セットことを確認です)が順番に(順番に)実行されます。
  • ループから脱出する最良の方法

これは可能ですか?

注:いくつかの研究は兵卒がtask Aが(:grunt.task.requires('A')grunt.task.requiresで)行われていない場合は与えられたtask Bが失敗したことを定義することを可能にするということであった後、私は見つけることができる最も近いもの。

+1

は、ループを使用しないでください、再帰的なアプローチで、あなたはとして非同期的にそれを行うことができますよく – Bergi

答えて

2

これは、我々は(Bergiさんのコメントの後を継いで)それを固定する方法である:

代わりのうなり声に明示的にループして実行するタスクにしようと、それはへの兵卒の自然なタスクの連鎖メカニズムを使用するのが最適です一つのタスクが他の後に実行されていることを確認し、そう

grunt.task.run(['preTask', 'changeValueTask', 'postTask']); 

はこのことを想定すると同じように、我々は(importantValueフラグをチェックすることで)再度実行する必要があるかどうかを確認するために、各postTaskの最後で再帰を使用 - 私たちは、これを達成します仕事は自分で

私たちは、不要な乱雑を避けるために、このループ動作を隔離するためにタスクにこの全体の再帰をブートストラップすることができ改良として
grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); 

grunt.registerTask('taskCheck', 'Recursive task.', function() { 
    var value = grunt.config('importantValue'); 
    if (value) { 
    // done... work with value 
    } else { 
    // keep running 
    grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); 
    } 
}); 

grunt.registerTask('runValueTask', 'Bootstrap to start recursion.', function() { 
    grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); 
}); 

grunt.registerTask('taskCheck', 'Recursive task.', function() { 
    var value = grunt.config('importantValue'); 
    if (value) { 
    // done... work with value 
    } else { 
    // keep running 
    grunt.task.run('runValueTask'); 
    } 
}); 
関連する問題