2013-01-18 13 views
8

これを見ていただきありがとうございます。クローズが機能していないループのノードグラント非同期タスク

ループ内で非同期タスクが動作していません。私は必ず作りました:

  1. ループは非同期タスクのみが値を返し、ずっと前に終了した「 だけ最後の値」問題、古典を避けるために閉鎖に私のループ変数「キー」をラップ最後の値が表示されます。
  2. 非同期タスクを完了するには(Gruntjs FAQで)
  3. キーがオブジェクトの実際のプロパティであり、プロトタイプから来ていないことを確認するためにhasOwnProperty()を使用します。
  4. execの値を変数に代入することを除いて、node.execの書式に従います。私が試したが、それは役に立たなかった。以下の最初の参照を参照してください。

この関数は...何も出力しません。なんらかの理由で、grunt.log.writeln文は起動しません。タスクはエラーなしで完了します。また、非同期タスクが返される前にスクリプトが終了した場合に備えて、20秒の遅延を追加しようとしました。奇妙なことに、私が "done(error)"と呼ばないと、ファイルはファイルに書き込まれます(writelnをgrunt.file.write文に置き換えると)。

var done = this.async(), 
    exec = require('child_process').exec, 
    myJSON = { 
     "file1" : "C:/home/me/jquery.js", 
     "file2 " : "C:/home/me/grunt.js", 
     ... 
     "fileN" : "C:/home/me/N.js" 
    }, 
    count; 

for (var key in myJSON) { 
    if (myJSON.hasOwnProperty(key)) { 
     (function (key) { 
     exec('type "' + myJSON[key] + '"', 
      function(error, stdout, stderr) { 
      if (error) { 
       grunt.log.writeln('!!! exec error: ' + error); 
      } 
      grunt.log.writeln('stdout: ' + stdout); 
      grunt.log.writeln('stderr: ' + stderr); 
      done(error); 
      } 
     ); 
     })(key); 
    count++; 
    } 
} 

参考文献:全体の動作が完了したとき

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback https://github.com/gruntjs/grunt/wiki/Frequently-Asked-Questions

答えて

12

done()は、すべてのexec()メソッドが自分のコールバックを実行したときを意味し、呼び出す必要があります。現在、各繰り返しでdoneコールバックを実行しています。あなたは順番に実行exec()方法をしたい場合は、簡単にノードのうなり声が付属していますモジュールasyncgrunt.util.async(またはforEachSeriesforEach方法を使用することによって、これを達成することができます

にこのような何か(テストされていません):。

var done = this.async(); 
var exec = require('child_process').exec; 
var async = grunt.util.async; // updated 
var myJSON = { 
    "file1": "C:/home/me/jquery.js", 
    "file2": "C:/home/me/grunt.js", 
    ... 
    "fileN": "C:/home/me/N.js" 
}; 

async.forEach(Object.keys(myJSON), function(el, cb) { 
    exec('type "' + myJSON[el] + '"', function(error, stdout, stderr) { 
     if (error) { 
      grunt.warn('!!! exec error: ' + error) 
      return cb(error); 
     } 
     grunt.log.writeln('stdout: ' + stdout); 
     grunt.log.writeln('stderr: ' + stderr); 
     cb(); 
    } 
); 
}, function(error) { 
    done(!error); 
}); 
+0

tyvm。よくある質問は、タスク内で_each_ asych操作のためにdone()を呼び出さなければならないと信じていました。これは大きな助けとなりました。私はあなたの時間を感謝しています:) – user1354017

+0

そのgrunt.utils.asyncユーティリティは、非同期タスクでの作業に適しています。手動でクロージャなどを作成するのではなく、正しいのですか? – user1354017

+0

直面していますが、ちょうど不平を言わずに。一般的なNode.jsで作業する場合は非常に貴重です。 https://github.com/caolan/async –

関連する問題